【发布时间】:2013-07-09 15:22:44
【问题描述】:
我正在尝试理解 Ruby 对象模型。我知道实例方法保存在类中而不是类的对象中,因为它消除了冗余。我读到,每当创建一个类时,也会为新创建的类创建一个元类。元类存储类方法。即类的单例方法位于元类中。例如
class MyClass
def hi
'hi object'
end
def self.bye
'bye singleton method'
end
end
对于上面的 MyClass,也创建了一个元类(比如#MyClass)。现在方法“hi”是一个实例级方法,可以在 MyClass 的所有对象上调用。 'bye' 方法是 MyClass 的单例方法,它驻留在 #MyClass 中。 'hi' 保存在 MyClass 而不是 MyClass 的所有对象中的原因(我认为是这样)是因为它避免了冗余。但是我们不能有多个名为 MyClass 的类。 那么为什么不将“再见”存储在 MyClass 而不是 #MyClass,因为我们不能拥有多个 MyClass。我完全不知道为什么会这样,我只是想了解背后的原因。
-----更新----
元类存储类信息,如单例方法和其他东西。但是既然一个类是一个单例对象(它是类 Class 的一个实例并且是它的类型)那么为什么不将所有信息保存在类本身而不是元类中。
【问题讨论】:
-
是什么让您认为创建了元类?
-
ObjectSpace.count_objects[:T_CLASS] 在声明新类时将计数增加 2。
-
如何确定额外的一个是元类?您是查看源代码还是只是假设额外的对象是元类?
-
我刚刚读到的关于元类的有趣文章 - ruby-metaprogramming.rubylearning.com/html/…
-
@texasbruce 我正在阅读“显微镜下的红宝石”。 Pat 解释说元类是创建的,但不幸的是他没有解释它是创建的。此外,“元编程 Ruby”也这么说。你必须阅读它,因为它很有趣。
标签: ruby