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