我的印象是obj.method
导致 ruby 寻找method
thusly:
- Look in
obj
的单例类。
- 查看包含的模块
obj
的单例类。
- Look in
obj
的班级。
- 查看包含的模块
obj
's class
- 对类的超类重复步骤 3 和 4,直到找到
- 如果从未找到,请致电
method_missing
在原始物体上,obj
.
在此模型下,only搜索该方法的单例类是原始接收者的单例类,obj
。然而,这个模型无法解释子类可以访问其超类的单例方法的事实。例如
class Foo
def self.foo
"foo"
end
end
class Bar < Foo
end
Bar.foo #=> "foo"
我很困惑,因为我相信这意味着Foo
的单例类在某个时刻会搜索该方法foo
。然而,在上面的模型下,我期望只有Bar
将搜索 的单例类foo
。如果做不到这一点,我希望红宝石能够查看Bar
的班级,Class
,然后继续沿着超类链向上爬(跳过Foo
及其单例类)。
所以我的问题是:我对 Ruby 方法查找的理解中缺少什么来解释类可以访问其超类的单例方法的事实?
当子类化时,不仅是Bar.superclass
set to Foo
,但这同样适用于单例类:
Bar.singleton_class.superclass == Foo.singleton_class # => true
所以你并没有真正感到困惑。实际的查找是:
- 从...开始
obj
的单例类。
- Look for instance methods down the ancestor list:
- 前置模块 (Ruby 2.0)
- 班级本身
- 包含的模块
- 对超类重复 #2。
- 重复#1,但这次寻找
method_missing
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)