我正在運行一些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