Coloquei outra resposta, embora a grande diferença já tenha sido apontada (precedência / encadernação), e isso possa causar problemas difíceis de encontrar (o Homem de Lata e outros apontaram isso). Acho que meu exemplo mostra o problema com um trecho de código não tão comum, mesmo programadores experientes não lêem como os 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
Então eu fiz algum código embelezando ...
#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 você alterar {}
aqui para do/end
obter o erro, esse método translate
não existe ...
Por que isso acontece é apontado aqui mais de uma precedência. Mas onde colocar aparelho aqui? (@ the Tin Man: eu sempre uso aparelho, como você, mas aqui ... supervisionado)
então cada resposta como
If it's a multi-line block, use do/end
If it's a single line block, use {}
está errado se usado sem o "MAS fique de olho nos aparelhos / precedência!"
novamente:
extend Module.new {} evolves to extend(Module.new {})
e
extend Module.new do/end evolves to extend(Module.new) do/end
(o que quer que o resultado da extensão faça com o bloco ...)
Portanto, se você quiser usar o / end use:
#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