Saya memberikan jawaban lain, meskipun perbedaan besar sudah ditunjukkan (prcedence / binding), dan itu dapat menyebabkan sulit untuk menemukan masalah (Manusia Timah, dan yang lainnya menunjukkan itu). Saya pikir contoh saya menunjukkan masalah dengan cuplikan kode yang tidak biasa, bahkan programmer yang berpengalaman tidak membaca seperti hari Minggu:
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
Lalu saya melakukan beberapa kode mempercantik ...
#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
jika Anda mengubah di {}
sini untuk do/end
Anda akan mendapatkan kesalahan, metode translate
itu tidak ada ...
Mengapa ini terjadi ditunjukkan di sini lebih dari satu - diutamakan. Tapi di mana harus memasang kawat gigi di sini? (@ the Tin Man: Saya selalu menggunakan kawat gigi, seperti Anda, tetapi di sini ... diawasi)
jadi setiap jawaban suka
If it's a multi-line block, use do/end
If it's a single line block, use {}
hanya salah jika digunakan tanpa "TAPI Mengawasi kawat gigi / didahulukan!"
lagi:
extend Module.new {} evolves to extend(Module.new {})
dan
extend Module.new do/end evolves to extend(Module.new) do/end
(Apa pun hasil dari perpanjangan tidak dengan blok ...)
Jadi, jika Anda ingin menggunakan do / end use this:
#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