大きな違いはすでに指摘されていますが(優先度/バインディング)、別の回答を示しました。これにより、問題を見つけるのが困難になる可能性があります(ティンマンなどが指摘しました)。私の例は、あまり一般的ではないコードスニペットの問題を示していると思います。
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
次に、コードを美化しました...
#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
{}
ここに変更do/end
すると、エラーが発生し、そのメソッドtranslate
は存在しません...
なぜこれが起こるのかは、ここで複数指摘されています-優先順位。しかし、ここにブレースをどこに置くのですか?(@The Tin Man:私はいつものように中括弧を使用しますが、ここでは...監視されています)
だからすべての答えは
If it's a multi-line block, use do/end
If it's a single line block, use {}
「しかし、中括弧/優先順位に注意してください!」なしで使用された場合は、間違っています
再び:
extend Module.new {} evolves to extend(Module.new {})
そして
extend Module.new do/end evolves to extend(Module.new) do/end
(extendの結果がブロックで何をするか...)
したがって、do / endを使用する場合は、次のように使用します。
#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