큰 차이가 이미 지적되었지만 (우선 순위 / 바인딩), 문제를 찾기 어려울 수있는 (틴맨과 다른 사람들이 지적 했음) 다른 대답 을했습니다. 내 예제는 그렇게 평범하지 않은 코드 스 니펫의 문제를 보여 주며 숙련 된 프로그램조차도 일요일과 같이 읽지 않는다고 생각합니다.
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
이 존재하지 않습니다 ...
왜 이런 일이 발생하는지는 둘 이상의 우선 순위로 지적됩니다. 그러나 여기서 중괄호를 어디에 둘 것인가? (@ 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