2012-08-03 2 views
4

괄호없이 다음과 같이 Enumerable#reduce(sym)을 호출 할 수없는 이유는 무엇입니까?Enumerable # reduce를 호출 할 때 나는 실제로 무엇을하고 있습니까?

>> [1, 2, 3].reduce :+ 
?> 

괄호이 결과를 사용하는 동안 :

>> [1, 2, 3].reduce(:+) 
=> 6 

내가 실수로 대신 Enumerable#reduce {| memo, obj | block }를 호출하는 건가요?

왜 이런 일이 발생합니까?

>> [1, 2, 3].reduce &:+ 
?> ^C 
>> [1, 2, 3].reduce(&:+) 
=> 6 

감사합니다.

답변

7

IRb의 파서에 오류가있는 것 같습니다.

ruby -e"res = [1, 2, 3].reduce :+ 
p res" 
# 6 

기본적으로, IRB 혼란 도착의 +는 이항 연산자이며, 두 번째 피연산자을 기다리고 생각한다 : 그것은 당신이 명령 줄이나 파일이나, 들어 올립니다에서 그것을 시도하는 경우 잘 작동합니다.

+0

+1 나는 Pry 같은 것이 있다는 것을 몰랐습니다. 또한 파일에서 확인하지도 않았습니다. 감사! – cyang

+0

참고 : 원래는'res = [1, 2, 3] .reduce : +; p res'를 예로 들겠지만, IRb가 잘 처리 할 수 ​​있다는 것이 밝혀졌습니다. 오류를 일으키는 개행이 필요합니다. –

+0

이전에'res = [1, 2, 3]. reduce : +;'를 시도했지만'?>'프롬프트를 보냈습니다. 나는'p res'를 타이핑하려고하지 않았다. – cyang

0

Ruby 파서가 특정 조합을 처리하지 못하는 것 같습니다. 기호에는 제한이 있지만 :+ 등은 대괄호가 올바르게 해석되어야하는 특수한 경우입니다.

유의하십시오. :+을 단독으로 사용해 보았을 때 구문 분석을 수행하지 마십시오. :*:/ 같은 다른 연산자에 대해서도 마찬가지이므로 "마법"이 여기에서 발생합니다.

+3

Ruby의 파서가이를 올바르게 처리합니다. 문제는 IRb의 파서입니다.이 파서는 기본적으로 Ruby 언어와 매우 유사하지는 않지만 잘 해석 할 수있는 것을 파싱하기 위해 함께 묶인 'Regexp'의 묶음입니다. Pry는 대신 YARV, JRuby 또는 Rubinius의 내장 파서를 사용하는데, 이는 정의상 항상 정확합니다. –

+0

더 합리적인 설명이 될 것입니다. 필자는 Ruby 인터프리터에서 'irb'가 극적으로 빗나간 것을 본 적이 없지만, 다시 한번, 나는 대괄호를 좋아한다. – tadman

관련 문제