我的印象是obj.method
因此导致红宝石寻找method
:
obj
的单身人士课程。obj
的单身类所包含的模块。obj
的课程。obj
班级method_missing
上调用obj
。在此模型下,搜索该方法的 only 单例类是原始接收器的单例类obj
。但是,这个模型无法解释子类可以访问其超类的单例方法的事实。例如
class Foo
def self.foo
"foo"
end
end
class Bar < Foo
end
Bar.foo #=> "foo"
我很困惑因为我认为这意味着Foo
的单例类在某个时刻搜索了方法foo
。但是,在上面的模型中,我希望只搜索Bar
的单例类foo
。如果不这样做,我希望ruby能够查看Bar
的类Class
,然后继续爬上超类链(完全跳过Foo
及其单例类)。
所以我的问题是:我对Ruby方法查找的理解缺少什么,这解释了一个类可以访问其超类的单例方法的事实?
答案 0 :(得分:8)
当子类化时,Bar.superclass
不仅设置为Foo
,而且对于单例类也是如此:
Bar.singleton_class.superclass == Foo.singleton_class # => true
所以你并不是真的很困惑。实际查找是:
obj
的单身人士课程开始。method_missing
答案 1 :(得分:3)
这很简单。或者不是真的,但无论如何:
The metaclass of the superclass is the superclass of the metaclass.
“metaclass”真的是“单身类”。您的模型中缺少的是Bar.superclass
继承Foo.superclass
。简单明了:)