Ruby,如何引用Root命名空间?

fgu*_*len 8 ruby program-entry-point

当我有这样的模块时:

module MyModule
  class MyClass
  end
end
Run Code Online (Sandbox Code Playgroud)

我可以访问/修改MyModule引用它:

MyModule.const_set("MY_CONSTANT", "value")
Run Code Online (Sandbox Code Playgroud)

但是Root命名空间呢,那个::?,我正在寻找类似的东西:

::.const_set("MY_CONSTANT", "value")
Run Code Online (Sandbox Code Playgroud)

const_set事情仅仅是一个例子,请不要试图解决这个具体的情况,但实际上在做参考的方式Root命名空间

Мал*_*евъ 12

什么是根对象?如果您指的是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>'
Run Code Online (Sandbox Code Playgroud)

如果您的意思是Object对象,请执行以下操作:

Object.const_set("MY_CONSTANT", "value")
# => "value"
Run Code Online (Sandbox Code Playgroud)

然后你可以在main,或任何其他级别使用:

::MY_CONSTANT
# => "value"
Run Code Online (Sandbox Code Playgroud)

添加另一个确认

我们可以使用Kernel或使用设置常量Object,在这两种情况下,可以从根命名空间访问常量:

Kernel.const_set("KERNEL_CONSTANT", "value")
Object.const_set("OBJECT_CONSTANT", "value")

puts !!(defined? ::KERNEL_CONSTANT) # => true
puts !!(defined? ::OBJECT_CONSTANT) # => true
Run Code Online (Sandbox Code Playgroud)

但是如果我们在根命名空间中设置一个常量,那么这个常量实际设置在Object而不是在Kernel:

::ROOT_CONSTANT = "value"

puts !!(defined? Object::ROOT_CONSTANT) # => true
puts !!(defined? Kernel::ROOT_CONSTANT) # => false
Run Code Online (Sandbox Code Playgroud)