关于Ruby中的类定义

时间:2011-10-27 10:09:16

标签: ruby class metaclass eigenclass

最近,我正在研究Ruby中有关类的一些细节,并且被类定义搞糊涂了。

在Ruby中,类定义如下,

class A
    def self.my_method
    end
end

相同
class A
    class << self
        def my_method
        end
    end
end
然后我很困惑。对于第一种情况,self可以被视为当前使用对象的指针,并且上下文的当前类是A.并且查找方法是递归完成的。但我的问题是, def 做了什么?它如何改变当前对象和上下文?第二种情况的问题是相同的。如何描述 class&lt;&lt;自我更改当前对象和上下文?

另一个问题。据我所知,所有Class对象都遵循fly-weight等设计模式,因为它们共享相同定义的Class对象。然后,本征类变得混乱。由于本征类中的def实际上定义了一个具有Class对象的方法,它如何与“def self。*”相关?

从外面看起来太复杂了,我可能需要Ruby的设计细节。

1 个答案:

答案 0 :(得分:4)

class A
  # self here is A
  def aa
    # self here is the instance of A who called this method
  end
  class << self
    # self is the eigenclass of A, a pseudo-class to store methods to a object.
    # Any object can have an eigenclass.
    def aa
      # self is the pseudo-instance of the eigenclass, self is A.
    end
  end
end

这是相同的:

class A
  def self.aa
  end
end

而且:

class << A
  def aa
  end
end

还有这个:

def A.aa
end

你可以打开任何东西的本征类:

hello = "hello"
class << hello
  def world
    self << " world"
  end
end
hello.world #=> "hello world"
"my".world  #=> NoMethodError

本征类实际上是Class的一个实例,它也有自己的本征类。

  

“如果它看起来太混乱,只要记住Class是一个对象而Object就是一个类。”