2010-02-23 8 views
3

최근 루비의 Proc에 대해 친구와 토론하고있었습니다. 여러 가지 방법 중 하나로 Proc에 전화 할 수 있습니다. 한 가지 방법은 Proc.call를 호출하는 것입니다Proc.call 대 Proc. [] 사용과 관련된 Ruby 우선 순위 문제가 있습니까?

p = Proc.new { |x| "hello, #{x}" } 
p.call "Bob" 
=> "hello, Bob" 

또 다른 괄호를 사용하는 것입니다, Proc.[] :

p ["Bob"] 
=> "hello, Bob" 

은 잠재적 우선 순위 문제는 여기에 있는가, 또는이 두 문장은 완전히 교환 할 수있다? 그렇지 않은 경우 다른 결과가 제공되는 상황의 예를 제공 할 수 있습니까?

답변

2

#call 기술은 잠재적으로 모호한 의도에 연산자 우선 순위를 할 수 있습니다 :

p = Proc::new do |a1| Proc::new do |a2| "#{a1.inspect}:#{a2.inspect}" end end 
p.call([1,2,3]).call [1] 
=> => "[1, 2, 3]:[1]" 
p.call [1,2,3][1] 
=> #<Proc:[email protected](irb):1> 
p.call([1,2,3])[1] 
=> "[1, 2, 3]:1" 
p[[1,2,3]][[1]] 
=> "[1, 2, 3]:[1]" 

[] 구문은 더 강력한 방법으로 인수의 구문 관계를 만들지 만, 당신은 괄호를 넣어 같은 효과를 얻을 것 인수 주위에 Proc#call.

+0

흠 ... 그건 내가 뭘하고있는 건지 잘 모르겠다. 이것은'.call (x) .call'과'.call x.call' 사이의 차이점을 나타내며'.call'과'[] '와는 다릅니다. –

+2

@ John Feminella, 차이를보기 위해'p [ "John"] [ "Barry"]'시도해보십시오. 어쩌면 에이단 (Aidan)은 그의 대답에 그것을 더하고 싶을 것이다. –

+1

@Wayne Conrad - 감사합니다. 저는이를 바탕으로 새로운 예를 도입했습니다. –