2011-09-25 114 views
6

我正在研究Ruby解釋器是如何實現的,還有一個問題沒有得到答案。這是標題中的一個:因爲Classr_cClass)已將super設置爲自身(忽略元類,因爲實際上superr_cClass的元類),所以如果我向Class對象發送一個方法,將在方法表中查看Class'class。但Class'類是Class,所以不應該最終看實例方法Class?但事實並非如此,因爲在文檔Class中的類方法和Class實例方法是分開的。在Ruby的search_methodeval.c中,我沒有發現Class類的任何特殊檢查。任何人都可以對此有所瞭解嗎?Class如何可以是Class類並且沒有Class實例方法?

+0

在一個像這樣抽象的問題中,給出具體的例子可能是一個好主意,例如一個實例方法的例子和一個類方法的例子。 –

回答

3

你對它應該工作方式的看法看起來不錯,但我不確定你爲什麼認爲它不能這樣工作。

在Ruby 1.8.7:

irb> a = Class.new.methods - Object.new.methods 
=> [... 36 element array ...] 
irb> b = Class.methods - Object.new.methods 
=> [... 37 element array ...] 
irb> b - a 
=> ["nesting"] 

一個普通的類實例(Class.new)具有36種實例方法。如果我看一下Class本身,它也是一個普通的類實例,它具有相同的36個實例方法,另外還有一個額外的類方法(嵌套),它的存在只是因爲它是從它的超類Module繼承的。

請注意,向Class中添加一個實例方法會自動將其添加爲一個類方法,但向Class的元類中添加一個類不會。

irb> class Class ; def everywhere ; true ; end ; end 
irb> class << Class ; def only_singleton ; true ; end ; end 
irb> Class.everywhere 
=> true 
irb> Class.new.everywhere 
=> true 
irb> Class.only_singleton 
=> true 
irb> Class.new.only_singleton 
NoMethodError: undefined method 'only_in_singleton' for #<Class:0x4800ac8> 
+0

所以這些方法實際上是一樣的。實際上,源代碼中沒有任何線索讓我意識到這一點。只是Ruby文檔明確地將Class實例方法與Class singleton方法分開。這種分離只是爲了清晰嗎? – eugeniodepalo

+0

通過單例方法你的意思是類方法? – rdvdijk

+0

是的,我的意思是類方法。 – eugeniodepalo

相關問題