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

时间:2014-01-21 15:58:33

标签: ruby main

当我有这样的模块时:

module MyModule
  class MyClass
  end
end

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

MyModule.const_set("MY_CONSTANT", "value")

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

::.const_set("MY_CONSTANT", "value")

const_set只是一个例子,请不要尝试解决这个具体情况,而是实际引用Root命名空间的方法

3 个答案:

答案 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混合到顶级命名空间中,因此您可以通过这种方式有效地在全局命名空间中定义常量。