2011-09-25 116 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

相关问题