Class怎么可以是Class类而没有Class实例方法?

时间:2011-09-25 11:02:25

标签: ruby class methods internals metaclass

我正在研究如何实现Ruby解释器,并且发生了一个问题,但我还没有得到答案。这是标题中的那个:因为Classr_cClass)已将super设置为自身(忽略元类,因为实际上superr_cClass的元类,如果我向Class对象发送一个方法,则会在Class'类的方法表中查找。但Class'类是Class,所以我最终不应该查看Class的实例方法吗?但事实并非如此,因为在文档Class中,类方法和Class实例方法是分开的。在Ruby search_method的{​​{1}}中,我没有找到eval.c类的任何特殊检查。任何人都可以对此有所了解吗?

1 个答案:

答案 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个实例方法,加上1个额外的类方法(嵌套),这只是因为它是从它的超类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>