Ho messo un'altra risposta, sebbene la grande differenza fosse già stata evidenziata (forzata / vincolante), e ciò può causare problemi difficili da trovare (l'Uomo di latta, e altri hanno sottolineato che). Penso che il mio esempio mostri il problema con uno snippet di codice non così normale, anche i programmatori esperti non leggono come i tempi della domenica:
module I18n
extend Module.new {
old_translate=I18n.method(:translate)
define_method(:translate) do |*args|
InplaceTrans.translate(old_translate, *args)
end
alias :t :translate
}
end
module InplaceTrans
extend Module.new {
def translate(old_translate, *args)
Translator.new.translate(old_translate, *args)
end
}
end
Poi ho fatto un po 'di abbellimento del codice ...
#this code is wrong!
#just made it 'better looking'
module I18n
extend Module.new do
old_translate=I18n.method(:translate)
define_method(:translate) do |*args|
InplaceTrans.translate(old_translate, *args)
end
alias :t :translate
end
end
se cambi {}
qui per do/end
ottenere l'errore, quel metodo translate
non esiste ...
Perché questo accada è indicato qui più di una precedenza. Ma dove mettere le parentesi graffe qui? (@the Tin Man: uso sempre le parentesi graffe, come te, ma qui ... supervisionato)
così ogni risposta piace
If it's a multi-line block, use do/end
If it's a single line block, use {}
è sbagliato se usato senza "MA tenere d'occhio parentesi graffe / precedenza!"
ancora:
extend Module.new {} evolves to extend(Module.new {})
e
extend Module.new do/end evolves to extend(Module.new) do/end
(qualunque cosa faccia il risultato di extension con il blocco ...)
Quindi se vuoi usare do / end usa questo:
#this code is ok!
#just made it 'better looking'?
module I18n
extend(Module.new do
old_translate=I18n.method(:translate)
define_method(:translate) do |*args|
InplaceTrans.translate(old_translate, *args)
end
alias :t :translate
end)
end