我的印象是obj.method
导致 ruby 如此寻找method
:
- 查看
obj
的单例类。 - 查看
obj
的单例类包含的模块。 - 在
obj
的课上看。 obj
查看类中包含的模块- 在类的超类上重复步骤 3 和 4,直到找到
- 如果从未找到,请调用
method_missing
原始对象,obj
.
在此模型下,唯一搜索该方法的单例类是原始接收者的单例类obj
。然而,这个模型无法解释子类可以访问其超类的单例方法这一事实。例如
class Foo
def self.foo
"foo"
end
end
class Bar < Foo
end
Bar.foo #=> "foo"
我很困惑,因为我相信这意味着Foo
在某些时候会搜索单例类的方法foo
。但是,在上面的模型下,我希望只会Bar
搜索 的单例类foo
。如果做不到这一点,我希望 ruby 会在Bar
's 类中查找Class
,然后继续爬上超类链(Foo
完全跳过及其单例类)。
所以我的问题是:我对 Ruby 方法查找的理解缺少什么来解释一个类可以访问其超类的单例方法的事实?