我被卡住了。我試圖動態地定義一個類方法,我無法將我的頭圍繞在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