在教程中,有一些示例使用const_get
查询常量:
class This
end
p Module.const_get('This').new
和
A_CONSTANT = 42
p Module.const_get('A_CONSTANT')
Module
?为什么不足const_get('This')
或self.const_get('This')
?写入所有内容的类是Object
,BasicObject
的祖先。 This
是一个常量的事实是否意味着它在其中包含类定义?就像它可以保持数字42
一样?或者更清楚,它是否相同:
This = class
end
就像一个未命名的方法,所以我可以写p This
并获得类定义?
答案 0 :(得分:2)
你已经获得了一些很好的知识。但是我不知道你为什么在你的标题中提到元编程,当你的问题是关于常数的时候。元编程是something else。
在任何情况下,#const_get
都是Module
类的实例方法,因此它不会在隐式接收器为Object
类的顶层工作。当你写
class Foo; end
常量Foo
已添加到Object
:
Object::Foo #=> Foo
Object::Bar #=> error (we didn't define constant Bar)
此常量在其他类中也可用,例如
Module::Foo #=> Foo, but with a warning
Array::Foo #=> same Foo with the same warning
Fixnum::Foo #=> ditto
换句话说,几乎每个模块都可以看到在顶层定义的Foo
。但访问像这样的频繁常量是不受欢迎的,因为这通常不是程序员想要的。您确实可以看到常量是在Object
:
Object.constants( false ).include? :Foo #=> true
而不是例如。 Module
:
Module.constants( false ).include? :Foo #=> false
但是,如果您使用#const_get
,则会禁止显示警告消息,您可能会认为Module::Foo
确实存在:
Module.const_get( :Foo ) #=> Foo
没有。