我被卡住了。我试图动态地定义一个类方法,我无法将我的头围绕在ruby元类模型上。考虑以下类:Ruby元类疯狂
class Example
def self.meta; (class << self; self; end); end
def self.class_instance; self; end
end
Example.class_instance.class # => Class
Example.meta.class # => Class
Example.class_instance == Example # => true
Example.class_instance == Example.meta # => false
很显然,这两种方法都返回一个Class实例。但是这两个例子 是不一样的。他们也有不同的祖先:
Example.meta.ancestors # => [Class, Module, Object, Kernel]
Example.class_instance.ancestors # => [Example, Object, Kernel]
在元类和类实例之间做出区别有什么意义?
我想通了,我可以send :define_method
元组动态定义一个方法,但如果我尝试将它发送到类实例将无法工作。至少我可以解决我的问题,但我仍然想明白为什么它以这种方式工作。
更新2010年3月15日13:40
有以下的假设是否正确。
- 如果我有一个调用self.instance_eval并定义方法的实例方法,它只会影响该类的特定实例。
- 如果我有一个调用self.class.instance_eval(与调用class_eval相同)的实例方法并定义了一个方法,它将影响该特定类的所有实例,从而产生新的实例方法。
- 如果我有一个调用instance_eval并定义一个方法的类方法,它将为所有实例创建一个新的实例方法。
- 如果我有一个调用meta/eigen类的instance_eval并定义方法的类方法,它将产生一个类方法。
我认为它开始对我有意义。如果类内部的自我指向特征类,它肯定会限制你的可能性。如果是这样,就不可能在类方法中定义一个实例方法。那是对的吗?
欲了解更多有关_why_实例_eval'内'def'定义的类方法,请参阅这篇文章http://yugui.jp/articles/846 – horseyguy 2010-03-15 12:15:05
非常感谢迄今。我更新我的问题。你介意看看它吗? – t6d 2010-03-15 12:44:15
更新后回答更新中的问题。 – khelll 2010-03-15 13:30:07