【发布时间】:2020-03-13 07:42:24
【问题描述】:
根据 Ruby const_get 的文档,此方法返回一个常量的值。
所以要重现以下行为:
module A
FOO = 42
module B
def self.call
FOO
end
end
end
A::B.call # => 42
我写了这段代码:
A = Module.new
A.const_set(:FOO, 42)
A.const_set(:B, Module.new do
def self.call
const_get(:FOO)
end
end)
但是当我调用该方法时,我有一个NameError 异常:
A::B.call # => exception
# NameError (uninitialized constant A::B::FOO)
# Did you mean? A::FOO
看起来FOO 和const_get(:FOO) 并不完全相同。
还有其他方法可以在父模块中递归查找FOO 常量吗?
编辑:
const_get 直接做我也有这个问题:
module A
FOO = 42
module B
def self.a_method
const_get(:FOO)
end
end
end
A::B.a_method # => exception
# NameError (uninitialized constant A::B::FOO)
# Did you mean? A::FOO
【问题讨论】:
-
见article on constant lookup。顺便说一句,如果没有问题,使用与核心方法名称相同的方法名称(此处为
call)会令人困惑。 -
在
module A内部定义module B实际上与直接定义module A::B不同。包装意味着当您以其他方式执行时不存在的搜索范围。 -
我同意@tadman 的评论,并且我添加了另一个示例以确保代码是ISO 与工作
FOO之一。唯一的区别是,我将FOO替换为const_get(:FOO)。它不再起作用。所以我认为麻烦来自const_get方法IMO。
标签: ruby metaprogramming