Je suis en cours d'exécution du code Ruby qui est évaluée comme un Rubis fichier à chaque fois que ses changements de date. Dans le fichier, j'ai des définitions de constantes, comme
Tau = 2 * Pi
et, bien sûr, ils font l'interprète afficher les indésirables "déjà initialisé constante" d'avertissement à chaque fois, donc, j'aimerais avoir les fonctions suivantes:
def_if_not_defined(:Tau, 2 * Pi)
redef_without_warning(:Tau, 2 * Pi)
J'ai pu éviter l'avertissement par écrit tous mes définitions de constantes comme ceci:
Tau = 2 * Pi unless defined?(Tau)
mais il est inélégant et un peu humide (pas SEC).
Est-il une meilleure façon d' def_if_not_defined
? Et comment redef_without_warning
?
--
Solution grâce à Steve:
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
--
Cette question est ancienne. Le code ci-dessus est seulement nécessaire pour Ruby 1.8. En Ruby 1.9, P3t3rU5 la réponse de produit sans avertissement et est tout simplement mieux.