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, Kernel, BasicObject]
然后我使用了Object#is_a?
实例方法进行检查,发现我的想法是错误的:
Module.is_a? Object
#=> true
Object.is_a? Module
#=> true
最初只是一个无辜的 ri
查询,却让我对整个 Ruby 对象模型感到困惑。
- 如果
Module
不在Object
的祖先链中,为什么Object.is_a? Module #=> true
? Object
如何知道const_get
方法?
Object
的祖先链误导了我,因为Object
是一个类,所以祖先链将显示哪些方法可用于该类的实例,对吧?但是Object
也有一个单例类(像所有对象一样),检查该祖先链将显示哪些方法可用于实际对象Object
。 - mbigrasObject#singleton_class
,这让我恍然大悟!你能否提到两个不同的祖先链,一个是针对Object
,另一个是针对Object.new
?检查Object.singleton_class.ancestors
和Object.new.singleton_class.ancestors
可以回答关于is_a?
的问题。 - mbigras