gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:43:24 25 4
gpt4 key购买 nike

我的印象是 obj.method 导致 ruby​​ 如此寻找 method:

  1. 查看 obj 的单例类。
  2. 查看 obj 的单例类包含的模块。
  3. 查看 obj 的类。
  4. 查看obj类包含的模块
  5. 在类的父类(super class)上重复步骤 3 和 4,直到找到
  6. 如果未找到,则对原始对象 obj 调用 method_missing

在该模型下,搜索方法的唯一单例类是原始接收者obj的单例类。但是,该模型无法解释子类可以访问其父类(super class)的单例方法这一事实。例如

class Foo
def self.foo
"foo"
end
end

class Bar < Foo
end

Bar.foo #=> "foo"

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

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

最佳答案

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

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

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

  1. obj 的单例类开始。
  2. 在祖先列表中查找实例方法:
    • 前置模块(Ruby 2.0)
    • 类(class)本身
    • 包含的模块
  3. 对父类(super class)重复#2。
  4. 重复 #1 但这次寻找 method_missing

关于ruby - Ruby 中类单例方法的方法查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11400148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com