最近,我正在研究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的设计细节。
答案 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就是一个类。”