加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – Object如何知道const_get方法?

发布时间:2020-12-17 03:08:00 所属栏目:百科 来源:网络整理
导读:我正在阅读 another question一个 answer,提到使用Module#const_get实例方法在模块中查找一个类.例如: module M class C endendp M.const_get 'C'#= M::C 我很好奇const_get方法所以我使用了ri并发现: ri Module#const_get...This method will recursively
我正在阅读 another question一个 answer,提到使用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

这让我感到困惑,因为我知道Module是一个Object而Object不是一个Module:

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

除此之外我使用了Object#is_a?实例方法检查并发现我错了:

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

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

>为什么Object.is_a?模块#=>如果Module不在Objects祖先链中,则为true?
> Object如何知道const_get方法?

解决方法

这是一个对象的类和对象的单例类之间不明白分离的工件,这是一类每个类用??于此类事物的影子类.

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

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

Module在这里出现,所以这些方法混合在一起并可通过Object调用.

对象本身具有相对枯燥的继承链:

Object.ancestors
#=> [Object,BasicObject]

Ruby中的每个对象都有一个类,甚至Class也是一个Object,它也有一个关联的Class.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读