Как переопределить константу 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 не выдает предупреждения и просто лучше.

Ответы на вопрос(4)

Ваш ответ на вопрос