Puse otra respuesta, aunque ya se señaló la gran diferencia (precedencia / encuadernación), y eso puede causar problemas difíciles de encontrar (el Hombre de hojalata y otros lo señalaron). Creo que mi ejemplo muestra el problema con un fragmento de código no tan habitual, incluso los programas experimentados no se leen como los domingos:
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
Luego hice un código de embellecimiento ...
#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
si cambia {}
aquí do/end
obtendrá el error, ese método translate
no existe ...
Por qué sucede esto se señala aquí más de uno: precedencia. ¿Pero dónde poner llaves aquí? (@ The Tin Man: siempre uso llaves, como tú, pero aquí ... supervisado)
entonces cada respuesta como
If it's a multi-line block, use do/end
If it's a single line block, use {}
es incorrecto si se usa sin el "PERO ¡Vigile los frenos / precedencia!"
de nuevo:
extend Module.new {} evolves to extend(Module.new {})
y
extend Module.new do/end evolves to extend(Module.new) do/end
(cualquiera que sea el resultado de extender con el bloque ...)
Entonces, si desea usar do / end, use esto:
#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