Sto eseguendo un codice Ruby che evalida un file Ruby ogni volta che cambia la data. Nel file, ho definizioni delle costanti, comeCome ridefinire una costante Ruby senza preavviso?
Tau = 2 * Pi
e, naturalmente, fanno visualizzare l'interprete gli indesiderati "già inizializzato costante" avviso ogni volta, così, mi piacerebbe avere le seguenti funzioni:
def_if_not_defined(:Tau, 2 * Pi)
redef_without_warning(:Tau, 2 * Pi)
ho potuto evitare l'avvertimento scrivendo tutte le mie definizioni delle costanti come questo:
Tau = 2 * Pi unless defined?(Tau)
ma è poco elegante e un po 'bagnato (non DRY).
C'è un modo migliore per def_if_not_defined
? E come redef_without_warning
?
-
soluzione grazie a 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
-
Questa domanda è vecchia. Il codice sopra riportato è necessario solo per Ruby 1.8. In Ruby 1.9, la risposta di P3t3rU5 non produce alcun avvertimento ed è semplicemente migliore.
Perché si desidera ridefinire una costante? È meglio mantenere le costanti dello spazio dei nomi mantenendole nelle proprie classi o moduli, in questo modo non entreranno mai in conflitto con altre costanti. –
Voglio ridefinire una costante perché voglio usare le costanti in modo naturale come se non stessi usando un caricatore automatico del codice sorgente, quindi non accetterò alcuna risposta "solo non usare una costante". –
Che cosa è inelegante e non SECCO su 'Tau = 2 * Pi se non definito? (Tau)'? – jrdioko