Я запускаю некоторый код 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 не дает предупреждения и просто лучше.
Почему вы хотите переопределить константу? Лучше использовать константы пространства имен, сохраняя их в своих собственных классах или модулях - таким образом они никогда не конфликтуют с другими константами. –
Я хочу переопределить константу, потому что я хочу использовать константы естественным образом, как если бы я не использовал автоматический перезагрузщик исходного кода, поэтому я не буду принимать никакого ответа «просто не используйте константу». –
Что такое неэлегантное, а не сухое о 'Tau = 2 * Pi, если не определено? (Tau)'? – jrdioko