gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:27 32 4
gpt4 key购买 nike

当我有这样的模块时:

module MyModule
class MyClass
end
end

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

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

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

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

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

最佳答案

什么是根对象?如果您指的是 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 设置常量,在这两种情况下都可以从 root 命名空间访问该常量:

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

关于Ruby,如何引用 Root 命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21263054/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com