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

时间:2012-07-09 17:34:13

标签: ruby

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

  1. 查看obj的单身人士课程。
  2. 查看obj的单身类所包含的模块。
  3. 查看obj的课程。
  4. 查看obj班级
  5. 所包含的模块
  6. 在类的超类上重复步骤3和4,直到找到
  7. 如果找不到,请在原始对象method_missing上调用obj
  8. 在此模型下,搜索该方法的 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方法查找的理解缺少什么,这解释了一个类可以访问其超类的单例方法的事实?

2 个答案:

答案 0 :(得分:8)

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

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

所以你并不是真的很困惑。实际查找是:

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

答案 1 :(得分:3)

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

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

“metaclass”真的是“单身类”。您的模型中缺少的是Bar.superclass继承Foo.superclass。简单明了:)