我正在运行一些Ruby代码,它会在每次更改日期时发送一个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的答案不会产生任何警告,而是更好。
为什么你想重新定义一个常数?更好地将常量保存在你自己的类或模块中,这样它们永远不会与其他常量发生冲突。 – 2010-07-30 21:11:44
我想重新定义一个常量,因为我想自然地使用常量,就像我没有使用自动源代码重载器一样,所以我不会接受任何“只是不使用常量”的答案。 – 2010-07-30 21:19:16
什么是不雅而不干的关于'Tau = 2 * Pi除非定义?(Tau)'? – jrdioko 2010-12-08 17:42:36