다음 예를 보시면
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)
로 고쳐쓰면 됩니다.