eug*_*alo 6 ruby methods metaclass class internals
我正在研究如何实现Ruby解释器,并且发生了一个问题,但我还没有得到答案.这是标题中的那个:因为Class(r_cClass)已经super设置为自身(忽略元类,因为实际上super是元类r_cClass),如果我向Class对象发送一个方法,这将在Class'类的方法表中查找.但是Class'类是Class,所以我最终不应该查看实例方法Class?但事实并非如此,因为在文档Class类中,方法和Class实例方法是分开的.在search_method以eval.c红宝石,我没有找到任何的专项检查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"]
Run Code Online (Sandbox Code Playgroud)
一个普通的类实例(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>
Run Code Online (Sandbox Code Playgroud)