加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:10:59 所属栏目:百科 来源:网络整理
导读:当我有这样的模块时: module MyModule class MyClass endend 我可以访问/修改引用它的MyModule: MyModule.const_set("MY_CONSTANT","value") 但是什么关于Root命名空间,:: one ?,我正在寻找类似的东西: ::.const_set("MY_CONSTANT","value") const_set只
当我有这样的模块时:
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读