Her ne kadar büyük fark zaten belirtilmiş olsa da (cevap / bağlama) ve bu sorun bulmakta zorlanmaya neden olabilir (Tin Man ve diğerleri bunu işaret etti). Bence benim örneğim o kadar alışılmadık bir kod pasajı ile sorunu gösteriyor, hatta deneyimli programcılar pazar günleri gibi okumuyor:
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
Sonra bazı kod güzelleştirici yaptım ...
#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
{}
burada değiştirirseniz do/end
hatayı alırsınız, bu yöntemtranslate
mevcut değildir ...
Bunun neden burada birden fazla - öncelik olduğu belirtiliyor. Ama buraya parantez koymak için nereye? (@Teneke Adam: Her zaman senin gibi parantez kullanırım, ama burada ... denetleniyor)
yani her cevap şöyle
If it's a multi-line block, use do/end
If it's a single line block, use {}
sadece yanlış olmadan kullanılırsa "AMA parantezi / önceliği bir göz atın!"
tekrar:
extend Module.new {} evolves to extend(Module.new {})
ve
extend Module.new do/end evolves to extend(Module.new) do/end
(uzatmanın sonucu blokla ne yaparsa ...)
Bu yüzden do / end komutunu kullanmak istiyorsanız bunu kullanın:
#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