3

我的印象是obj.method导致 ruby​​ 如此寻找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"

我很困惑,因为我相信这意味着Foo在某些时候会搜索单例类的方法foo。但是,在上面的模型下,我希望只会Bar搜索 的单例类foo。如果做不到这一点,我希望 ruby​​ 会在Bar's 类中查找Class,然后继续爬上超类链(Foo完全跳过及其单例类)。

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

4

2 回答 2

8

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

Bar.singleton_class.superclass == Foo.singleton_class  # => true

所以你并没有真正感到困惑。实际查找是:

  1. obj的单例类开始。
  2. 在祖先列表中查找实例方法:
    • 前置模块(Ruby 2.0)
    • 班级本身
    • 包含的模块
  3. 对超类重复 #2。
  4. 重复#1,但这次寻找method_missing
于 2012-07-09T17:50:53.753 回答
3

这很简单。或者不是真的,但无论如何:

The metaclass of the superclass is the superclass of the metaclass.

“元类”实际上是“单例类”。您的模型中缺少的是Bar.superclass继承Foo.superclass。干净利落 :)

于 2012-07-09T18:02:31.590 回答