我正在运行一些 Ruby 代码,每次更改日期时都会评估 Ruby 文件。在文件中,我有常量定义,比如
Tau = 2 * Pi
而且,当然,它们使解释器每次都显示不需要的“已经初始化的常量”警告,所以,我想要以下功能:
def_if_not_defined(:Tau, 2 * Pi)
redef_without_warning(:Tau, 2 * Pi)
我可以通过像这样编写所有常量定义来避免警告:
Tau = 2 * Pi unless defined?(Tau)
但它不优雅而且有点湿(不是DRY)。
有更好的方法def_if_not_defined
吗?怎么做redef_without_warning
?
--
感谢史蒂夫的解决方案:
class Object
def def_if_not_defined(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.const_set(const, value) unless mod.const_defined?(const)
end
def redef_without_warning(const, value)
mod = self.is_a?(Module) ? self : self.class
mod.send(:remove_const, const) if mod.const_defined?(const)
mod.const_set(const, value)
end
end
A = 1
redef_without_warning :A, 2
fail 'unit test' unless A == 2
module M
B = 10
redef_without_warning :B, 20
end
fail 'unit test' unless M::B == 20
--
这个问题很老了。上面的代码只对 Ruby 1.8 是必需的。在 Ruby 1.9 中,P3t3rU5 的答案不会产生任何警告,而且更好。