gpt4 book ai didi

ruby - Object 是如何知道 const_get 方法的?

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

我正在阅读 another questionanswer其中提到使用 Module#const_get 实例方法在模块中查找类。例如:

module M
class C
end
end

p M.const_get 'C'
#=> M::C

我对 const_get 方法很好奇,所以我使用了 ri 并发现:

ri Module#const_get
...
This method will recursively look up constant names if a namespaced
class name is provided. For example:

module Foo; class Bar; end end
Object.const_get 'Foo::Bar'
...

Object::const_get 似乎是一个单例方法。在我们的上下文中使用它是有效的:

module M
class C
end
end

p Object.const_get 'M::C'
#=> M::C

但是没有关于该单例方法的任何文档:

ri Object::const_get
Nothing known about Object::const_get
ri Object.const_get
Nothing known about Object.const_get

这让我感到困惑,因为我知道 ModuleObjectObject 不是 Module:

Module.ancestors
#=> [Module, Object, Kernel, BasicObject]
Object.ancestors
#=> [Object, Kernel, BasicObject]

除了然后我使用 Object#is_a? 实例方法来检查并发现我错了:

Module.is_a? Object
#=> true
Object.is_a? Module
#=> true

最初是一个无辜的 ri 查询让我对整个 Ruby 对象模型感到困惑。

  • 为什么 Object.is_a? Module #=> true 如果 Module 不在 Object 的祖先链中?
  • Object 如何知道 const_get 方法?

最佳答案

这是一个对象的类和对象的单例类之间未被充分理解的分离的产物,每个类都使用这样的影子类。

您可以在 Ruby 2.5+ 中使用 singleton_class 方法轻松访问它:

Object.singleton_class.ancestors
# => [#<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]

Module 出现在这里的地方,所以这就是这些方法如何混合并通过 Object 调用的方式。

对象本身有一个比较沉闷的继承链:

Object.ancestors
#=> [Object, Kernel, BasicObject]

Ruby 中的每个对象都有一个类,即使 Class 是一个 Object,它也有一个关联的 Class

关于ruby - Object 是如何知道 const_get 方法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49867219/

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