当我有这样的模块时:
module MyModule
class MyClass
end
end
我可以访问/修改MyModule
引用它:
MyModule.const_set("MY_CONSTANT", "value")
但是Root
名称空间,::
名称空间呢?我正在寻找类似的东西:
::.const_set("MY_CONSTANT", "value")
const_set
只是一个例子,请不要尝试解决这个具体情况,而是实际引用Root
命名空间的方法
答案 0 :(得分:10)
什么是根对象?如果您指的是main
对象,则无法在此级别设置常量:
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"
然后您可以在main
或任何其他级别使用
::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
但是如果我们在 root命名空间中设置一个常量,那么这个常量实际上是在Object
而不是Kernel
中设置的:
::ROOT_CONSTANT = "value"
puts !!(defined? Object::ROOT_CONSTANT) # => true
puts !!(defined? Kernel::ROOT_CONSTANT) # => false
答案 1 :(得分:0)
没有像Root模块这样的东西,但是你可以在Object类上运行一些非常相似的东西:
def bar
'bar'
end
class A
def bar
'not bar'
end
def test
bar
end
def test2
Object.bar
end
end
A.new.test #=> 'not bar'
A.new.test2 #=> 'bar'
您可以在此处阅读main
对象:http://banisterfiend.wordpress.com/2010/11/23/what-is-the-ruby-top-level/
答案 2 :(得分:-1)
Ruby中没有root模块。
您可以在顶级命名空间中定义模块,如下所示:
::MY_CONSTANT = "value"
如果由于某种原因你 使用const_set
,你可以这样做:
module Hi
Kernel.const_set("X", "3")
end
puts X # => 3
Kernel
混合到顶级命名空间中,因此您可以通过这种方式有效地在全局命名空间中定义常量。