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? 解决方法
这是一个对象的类和对象的单例类之间不明白分离的工件,这是一类每个类用??于此类事物的影子类.
您可以使用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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |