ฉันใส่คำตอบอีกครั้งแม้ว่าความแตกต่างที่ยิ่งใหญ่ได้ชี้ให้เห็นแล้ว (การอ้างอิง / การผูกมัด) และนั่นอาจทำให้เกิดปัญหาในการค้นหาปัญหาได้ยาก (Tin Man และคนอื่น ๆ ชี้ให้เห็น) ฉันคิดว่าตัวอย่างของฉันแสดงปัญหากับโค้ดขนาดสั้นที่ไม่ปกตินักแม้แต่โปรแกรมเมอร์ที่มีประสบการณ์ก็ไม่ได้อ่านเหมือนวันอาทิตย์:
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
(สิ่งที่เคยเป็นผลมาจากการขยายทำกับบล็อก ... )
ดังนั้นหากคุณต้องการใช้ 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