从Module中引用常量

时间:2014-08-05 07:22:48

标签: ruby

在教程中,有一些示例使用const_get查询常量:

class This
end

p Module.const_get('This').new

A_CONSTANT = 42
p Module.const_get('A_CONSTANT')
  1. 我看不到任何模块定义。为什么使用Module?为什么不足const_get('This')self.const_get('This')?写入所有内容的类是ObjectBasicObject的祖先。
  2. This是一个常量的事实是否意味着它在其中包含类定义?就像它可以保持数字42一样?或者更清楚,它是否相同:

    This = class
    end
    

    就像一个未命名的方法,所以我可以写p This并获得类定义?

1 个答案:

答案 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

没有。

相关问题