我正在研究Ruby解釋器是如何實現的,還有一個問題沒有得到答案。這是標題中的一個:因爲Class
(r_cClass
)已將super
設置爲自身(忽略元類,因爲實際上super
是r_cClass
的元類),所以如果我向Class
對象發送一個方法,將在方法表中查看Class
'class。但Class
'類是Class
,所以不應該最終看實例方法Class
?但事實並非如此,因爲在文檔Class
中的類方法和Class
實例方法是分開的。在Ruby的search_method
的eval.c
中,我沒有發現Class
類的任何特殊檢查。任何人都可以對此有所瞭解嗎?Class如何可以是Class類並且沒有Class實例方法?
回答
你對它應該工作方式的看法看起來不錯,但我不確定你爲什麼認爲它不能這樣工作。
在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>
所以這些方法實際上是一樣的。實際上,源代碼中沒有任何線索讓我意識到這一點。只是Ruby文檔明確地將Class實例方法與Class singleton方法分開。這種分離只是爲了清晰嗎? – eugeniodepalo
通過單例方法你的意思是類方法? – rdvdijk
是的,我的意思是類方法。 – eugeniodepalo
- 1. class Class - instance與類方法
- 2. Class實例變量沒有
- 3. isJavaType(Class class)or isUserType(Class class)?
- 4. (「Child Class」是「Parent class」)
- 5. 是否可以選擇類和類&class,而不僅僅是class OR類或類?
- 6. 沒有的.class
- 7. Objective-c:如何在類方法中獲得Class實例
- 8. 例子和Class方法相同。可能?
- 9. 沒有調整函數調用class :: class
- 10. 爲什麼Class是Class的一個實例,而不是Object的實例?
- 11. 有沒有辦法讓Java Outer Class的實例調用Java Inner Class的所有實例?
- 12. 如何before_filter Module :: Class ::方法?
- 13. Class org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory是沒有javax.faces.context.ExceptionHandlerFactory
- 14. 是否可以更改具有不同Class的對象的Class類型?
- 15. 如何使用PowerMock模擬其他Class以外的Class的私有方法?
- 16. 在Typescript中是否有「Class」類型?並且「any」包含它嗎?
- 17. 錯誤:`class CLASS`中的'MEMBER`沒有指定類型; C++
- 18. RegEx刪除空屬性?例如。 if(class =「」|| class =「」)remove;其他假類
- 19. Class實例擴展了泛型超類
- 20. 是否有一種方法可以推導出正在執行Class方法的Class類型,而無需實例化對象?
- 21. 套用class&ng-class
- 22. class * object = new class [size]
- 23. class in class in java
- 24. 如何獲取沒有實例的Class對象?
- 25. 「class variable」,「class variable()」和「class variable(argument)
- 26. 何時使用class :: function或class->函數,是否有首選方法?
- 27. Ruby:如何從模塊調用Class的實例方法?
- 28. 類變量:「class list」vs「class boolean」
- 29. 如何將const Class *轉換爲Class *?
- 30. 在Class中Class Class <:: OtherClassName是做什麼的?
在一個像這樣抽象的問題中,給出具體的例子可能是一個好主意,例如一個實例方法的例子和一個類方法的例子。 –