Ruby中类单例方法的方法查找

Chr*_*ice 3 ruby

我的印象是obj.method导致红宝石method如此寻找:

  1. 看看obj单身课.
  2. 查看obj单例类所包含的模块.
  3. 看看obj上课.
  4. 查看obj班级所包含的模块
  5. 在类的超类上重复步骤3和4,直到找到
  6. 如果从未找到,请调用method_missing原始对象obj.

在这个模型下,搜索该方法的唯一单例类是原始接收器的单例类obj.但是,这个模型无法解释子类可以访问其超类的单例方法的事实.例如

class Foo
  def self.foo
    "foo"
  end
end

class Bar < Foo
end

Bar.foo  #=> "foo"
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为我相信这意味着Foo单身类在某些时候搜索了这个方法foo.但是,根据上面的模型,我希望只Bar搜索单例类foo.如果做不到这一点,我希望ruby可以查看Bar类,Class然后继续爬上超类链(Foo完全跳过它的单例类).

所以我的问题是:我对Ruby方法查找的理解缺少什么,这解释了一个类可以访问其超类的单例方法的事实?

Mar*_*une 8

子类化时,不仅Bar.superclass设置为Foo,而且对于单例类也是如此:

Bar.singleton_class.superclass == Foo.singleton_class  # => true
Run Code Online (Sandbox Code Playgroud)

所以你真的不会感到困惑.实际的查找是:

  1. obj单身课开始.
  2. 在祖先列表中查找实例方法:
    • 前置模块(Ruby 2.0)
    • 班级本身
    • 包含模块
  3. 用超类重复#2.
  4. 重复#1,但这次寻找 method_missing