Ruby에서 메소드 호출시 괄호 넣기 규칙

Tags:

다음 예를 보시면

irb(main):018:0> 1.+2 
=> 3 
irb(main):019:0> puts 1.+2 
(irb):19: warning: parenthesize argument(s) for future version 
3 
=> nil 

1.+2 는 에러가 나지 않으나 puts 1.+2 는 에러가 납니다. 왜일까요?

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/190006 의 쓰레드를 따라 읽어보시면 아실 수 있듯이 루비에서는 인자를 받은 메소드를 다른 메소드에 인자로 넘길 때 반드시 괄호를 해야합니다.

이에 대한 예는 다음과 같습니다.

Array.new 3, 1 (Array.new에 대한 2개의 인자만 존재하므로 ok) 
p Array.new 3, 1 (두개의 인자를 받는 Array.new 가 또 다시 p 로 넘어가므로 warning) 

p Array.new 3 1가 warning이 발생하는 이유는

p(Array.new(3), 1)

인지

p(Array.new(3, 1))

인지 파서가 보기에 ambiguous 하기 때문입니다. 또 다른 예를 들어보겠습니다.

1.+2 (1의 + 메소드에 대해 2를 넘기는 것이므로 ok) 
p 1.+2 (2를 인자로 받는 1의 메소드인 +를 호출하고 이를 다시 p로 넘기므로 warning) 

이런 규칙에 대한 약간의 예외는 다음과 같습니다.

1+2 (이는 1.+2 이므로 ok) 
p 1+2 (의미상 p 1.+2인데 왜 에러가 안날까요?) 
p 1.+2 (명시적으로 쓴 경우에는 에러가 납니다.) 

아마도 Ross Bamford이라는 사람과 제 생각은 파서 규칙이 그렇게 써져있다 입니다. 즉 + 는 너무 자주 사용되는 연산자이므로 1+2는 무조건 1.+(2) 로 해석하게 했다는 거죠.

다음 명령은 warning이 발생합니다. 어떻게 고쳐야 할까요?

p 10.*9 

이 호출을 좀 더 보기 편하게 10을 foo, *를 bar로 고치면

p foo.bar 9

가 됩니다. 9를 인자로 받는 foo.bar가 p에 넘어가고 있으므로 경고가 나는 것입니다. 이는 p foo.bar(9) 혹은 p(foo.bar 9)로 고칠 수 있으므로

p 10.*(9) 또는 p(10.*9)

로 고쳐쓰면 됩니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *