我正在研究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
- 6. Objective-c:如何在類方法中獲得Class實例
- 7. 沒有調整函數調用class :: class
- 8. 有沒有辦法讓Java Outer Class的實例調用Java Inner Class的所有實例?
- 9. 如何before_filter Module :: Class ::方法?
- 10. Class org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory是沒有javax.faces.context.ExceptionHandlerFactory
- 11. 錯誤:`class CLASS`中的'MEMBER`沒有指定類型; C++
- 12. Class實例擴展了泛型超類
- 13. class * object = new class [size]
- 14. 「class variable」,「class variable()」和「class variable(argument)
- 15. 何時使用class :: function或class->函數,是否有首選方法?
- 16. 類變量:「class list」vs「class boolean」
- 17. 在Class中Class Class <:: OtherClassName是做什麼的?
- 18. 在ruby中使用Class方法調用實例方法
- 19. @class
- 20. .class?
- 21. 錯誤:無法獲得«class»,«class»,...}
- 22. 「Class myclass = Class()」是否浪費資源?
- 23. MethodRental Class的實際用法?
- 24. final Class和Class有什麼區別?
- 25. 如何以人類可讀的方式打開Java .class文件?
- 26. 是否有任何理由在'.class'上使用selector'* .class'?
- 27. 爲什麼「[self class] == [super class]」?
- 28. .class是方法還是字段?
- 29. 'class'屬性沒有聲明
- 30. Class是什麼?
在一個像這樣抽象的問題中,給出具體的例子可能是一個好主意,例如一個實例方法的例子和一個類方法的例子。 –