我被困住了。我正在尝试动态定义一个类方法,但我无法理解 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 并定义一个方法的类方法,它将为所有实例生成一个新的实例方法。
- 如果我有一个类方法,它在元/特征类上调用 instance_eval 并定义一个方法,它将产生一个类方法。
我认为它开始对我有意义。如果类方法中的 self 指向 eigen 类,那肯定会限制您的可能性。如果是这样,就不可能从类方法内部定义实例方法。那是对的吗?