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