当我有这样的模块时:
- module MyModule
- class MyClass
- end
- end
我可以访问/修改引用它的MyModule:
- MyModule.const_set("MY_CONSTANT","value")
但是什么关于Root命名空间,:: one ?,我正在寻找类似的东西:
- ::.const_set("MY_CONSTANT","value")
const_set只是一个例子,请不要试图解决这个具体情况,而是实际引用Root命名空间的方式
解决方法
什么是根对象?如果您指的是主要对象,则无法在此级别设置常量:
- TOPLEVEL_BINDING.eval('self').const_set("MY_CONSTANT","value")
- # NoMethodError: undefined method `const_set' for main:Object
- # from (irb):71
- # from /home/malo/.rvm/rubies/ruby-2.1.0/bin/irb:11:in `<main>'
如果您指的是Object对象,请执行以下操作:
- Object.const_set("MY_CONSTANT","value")
- # => "value"
然后你可以在主要或任何其他级别使用:
- ::MY_CONSTANT
- # => "value"
添加另一个确认
我们可以使用Kernel或使用Object设置常量,在这两种情况下,可以从根命名空间访问常量:
- Kernel.const_set("KERNEL_CONSTANT","value")
- Object.const_set("OBJECT_CONSTANT","value")
- puts !!(defined? ::KERNEL_CONSTANT) # => true
- puts !!(defined? ::OBJECT_CONSTANT) # => true
但是如果我们在根命名空间中设置一个常量,那么这个常量实际上是在Object中而不是在内核中设置的:
- ::ROOT_CONSTANT = "value"
- puts !!(defined? Object::ROOT_CONSTANT) # => true
- puts !!(defined? Kernel::ROOT_CONSTANT) # => false