Tôi đặt một câu trả lời khác, mặc dù sự khác biệt lớn đã được chỉ ra (tính bắt buộc / ràng buộc) và điều đó có thể gây ra vấn đề khó tìm (Người đàn ông Tin và những người khác đã chỉ ra điều đó). Tôi nghĩ rằng ví dụ của tôi cho thấy vấn đề với một đoạn mã không thông thường, ngay cả các lập trình viên có kinh nghiệm cũng không đọc như thời gian chủ nhật:
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
Sau đó, tôi đã làm một số mã làm đẹp ...
#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
Nếu bạn thay đổi {}
ở đây, do/end
bạn sẽ gặp lỗi, phương pháp đótranslate
đó không tồn tại ...
Tại sao điều này xảy ra được chỉ ra ở đây nhiều hơn một - ưu tiên. Nhưng đặt niềng răng ở đâu? (@the Tin Man: Tôi luôn sử dụng niềng răng, giống như bạn, nhưng ở đây ... giám sát)
vì vậy mọi câu trả lời như
If it's a multi-line block, use do/end
If it's a single line block, use {}
chỉ là sai nếu sử dụng mà không có "NHƯNG Hãy để mắt đến niềng răng / ưu tiên!"
lần nữa:
extend Module.new {} evolves to extend(Module.new {})
và
extend Module.new do/end evolves to extend(Module.new) do/end
(kết quả của việc mở rộng sẽ làm gì với khối ...)
Vì vậy, nếu bạn muốn sử dụng do / end, hãy sử dụng:
#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