class Foo
def self.one; 1 end
class << self
def two; 2 end
end
end
puts Foo.singleton_methods.inspect # => ["two", "one"]
我已被告知上述方法“一”和“两”在概念上是不同的,但我不知道如何。 他们都是单身方法 - 概念和应用程序有什么区别?ruby有什么区别self.method和类内的方法<< self
class Foo
def self.one; 1 end
class << self
def two; 2 end
end
end
puts Foo.singleton_methods.inspect # => ["two", "one"]
我已被告知上述方法“一”和“两”在概念上是不同的,但我不知道如何。 他们都是单身方法 - 概念和应用程序有什么区别?ruby有什么区别self.method和类内的方法<< self
在应用中,没有区别。在概念上,区别很微妙,但在第一种情况下,您正在当前上下文中操作,并在另一个类实例(实际上是其Eigen类中的实例方法)上定义方法,而在第二种情况下,您正在输入其他类实例的元类(“Eigenclass”)的上下文,然后定义一个实例方法。
编辑:
我要补充的是,选择在某些情况下,class << self
的原因是...
def my_method ...
之外,您还可以在Eigenclass上下文中执行其他类型的代码。例如,您可以在该代码块中说attr_accessor :some_attribute
。我强烈建议您阅读“Metaprogramming Ruby”。 本书解释了Ruby的对象模型,包括单例方法和单例类。
http://pragprog.com/titles/ppmetr/metaprogramming-ruby
本文还介绍了同一个主题。
http://www.contextualdevelopment.com/articles/2008/ruby-singleton
我会结帐元编程红宝石。 – djburdick 2011-04-01 05:31:38
我实际上从您发送的链接中获得了我的代码段,因为我在该文章后仍然感到困惑。摘录“虽然一些面向对象的语言具有支持实例方法和类方法(有时称为静态方法)的类结构,但Ruby仅支持实例方法。如果Ruby仅支持实例方法,那么您所创建的所有类方法在哪里结束为什么,当然是单身课。“对我来说,这是说self.method是相同的 - 即他们都是单身人士 – djburdick 2011-04-01 05:33:08
Ruby仅支持实例方法,但类也是Class类的一个实例。将方法添加到实例(包括Class实例,即一个类)时,实际上是将实例的类更改为新的匿名子类,然后向该子类添加新的实例方法。该匿名子类通常被称为特征类。 – 2011-04-01 07:01:09
+1。那么'module_function'呢?我很想知道它的不同之处。 – sawa 2011-04-01 02:29:26