我正在研究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是做什么的?
在一个像这样抽象的问题中,给出具体的例子可能是一个好主意,例如一个实例方法的例子和一个类方法的例子。 –