Ruby에서 메소드 호출시 괄호 넣기 규칙위 글은 Rubyist에서 MKSeo님이 올리신 글이다. 루비에서는 메쏘드 호출시 모호하지만 않다면 괄호를 사용하지 않아도 되기 때문에 사용하지 않다보면 모호한 경우가 발생하게 되어 인터프리터가 경고를 발생시킨다. 이러한 문제가 발생할 소지가 있는 문장을 쓰면서도 미처 생각하지 못하고 왜 경고가 나왔을까 의문스러워 할 수 있다. 이러한 경우를 위해 MKSeo님이 글을 쓰신 듯 하다. 루비를 이제 배우는 입장에서 MKSeo님의 글은 그 경고가 왜 나왔는지에 대한 의문을 해소해준다.
그런데 조금 더 명확한 예가 필요하지 않을까 하여 간단히 예를 만들어봤다. 그리고 MKSeo님의 글을 읽고 이해한 대로 간단히 설명도 덛붙였다.
class Test
attr_reader :name
def initialize name
@name = name
end
def + test
Test.new @name+test.name
end
def to_s
@name
end
end
def out val
puts val.to_s + " - by out"
val
end
t1 = Test.new "hangulee"
t2 = Test.new "Ruby"
puts (out t1+t2)
puts
puts (out t1.+(t2))
puts
puts (out (t1.+t2))
puts
puts ((out t1).+t2)
puts
out t1.+t2
위 클래스는 + 메쏘드를 정의하여 이름을 더한 값을 가지고 새로운 객체를 만들어 반환을 하게 한다. 따라서 위의 경우
t1+t2 의 결과는 "hanguleeRuby"가 된다. 그리고 out이라는 이름을 가진 함수는 넘겨받은 변수를 출력하고 되돌려준다. 그리고
out t1.+t2 라고 썼을 경우 해석할 수 있는 모든 경우를 실행시켜보았다. 위의 예제의 결과는 아래와 같다
hanguleeRuby - by out
hanguleeRuby
hanguleeRuby - by out
hanguleeRuby
hanguleeRuby - by out
hanguleeRuby
hangulee - by out
hanguleeRuby
hanguleeRuby - by out
Y:/workspace/RubyTest/Test9.rb:30: warning: parenthesize argument(s) for future version
보면 알수 있겠지만
t1+t2 라는 연산을 수행하면
t1.+(t2) 와 같이 수행한다. 따라서 "hanguleeRuby"가 출력된다. 그리고 명시적으로 묶어준 경우에는 그에 따라 수행되는데,
puts ((out t1).+t2) 는
out 이라는 함수가 "hangulee"만 출력하고 그것을 되돌려준 값에
t2 를 더해서
puts 가 출력하므로 "hanguleeRuby"가 출력된다.
하지만
out t1.+t2 의 경우에는
(out t1.+(t2)) 인지, 혹은 ((out t1).+t2) 인지 모호하기 때문에
(out t1.+(t2)) 라고 가정하여 결과를 돌려주지만 경고를 발생시킨다.