Ich habe eine andere Antwort gegeben, obwohl bereits auf den großen Unterschied hingewiesen wurde (Vorrang / Bindung), und dies kann zu schwer zu findenden Problemen führen (der Blechmann und andere haben darauf hingewiesen). Ich denke, mein Beispiel zeigt das Problem mit einem nicht so üblichen Code-Snippet, selbst erfahrene Programmierer lesen nicht wie am Sonntag:
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
Dann habe ich Code verschönert ...
#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
Wenn Sie das {}
hier in ändern , do/end
wird der Fehler angezeigt, diese Methode translate
existiert nicht ...
Warum dies geschieht, wird hier mehr als einmal hervorgehoben. Aber wo soll man hier Zahnspangen anbringen? (@the Tin Man: Ich benutze immer Zahnspangen, wie Sie, aber hier ... beaufsichtigt)
so mag jede antwort
If it's a multi-line block, use do/end
If it's a single line block, use {}
ist einfach falsch, wenn es ohne "ABER Behalte Klammern / Vorrang!"
nochmal:
extend Module.new {} evolves to extend(Module.new {})
und
extend Module.new do/end evolves to extend(Module.new) do/end
(Was auch immer das Ergebnis von Extend mit dem Block macht ...)
Wenn Sie also do / end verwenden möchten, verwenden Sie Folgendes:
#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