2014-09-24 5 views
1

는이 코드루비의 삼항 연산자

options = arguments[-1].is_a?(Hash) ? arguments.pop : {} 

if arguments[-1].is_a?(Hash) 
    options = arguments.pop 
else 
    options = {} 
end 

로 변환을 이해합니다. 그러나

puts 10 > 5 ? "greater" : "less" 

"greater" 두 코드의 차이점은 무엇입니까?

+0

코드에 의해 발생한 예외와 관련된 질문을 게시 할 때 완전한 오류 메시지와 명확하지 않은 경우 발생한 오류 메시지를 제공하십시오. 오류 메시지에는 중요한 정보가 들어 있습니다. 당신은 그들을 신중하게 연구해야합니다. –

답변

4

키워드/연산자의 구문 오류와 우선 순위입니다. 삼원 연산자의 ?puts 지나가는 인수보다 더 높은 우선 순위를 가지므로, 루비 :puts 후 예상되는 바와 같이, 유효하지 않은 구문이다

10 > 5 ? puts "greater" : puts "less" 

(10 > 5) ? (puts) ("greater") 

로 파싱한다.

10 > 5 ? puts("greater") : puts("less") 

은 예상대로 작동합니다.

-1

3 진수 연산자를 사용하면 먼저 options =을 수행하는 첫 번째 예에서 작업을 수행하고 있습니다. 두 번째 예에서는 10 > 5을 확인한 후 puts을 넣습니다. 기본적으로 구문 오류입니다.

2

이것은 단순히 구문 오류입니다 (제 IRB는 syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('라고 말합니다). 이것은 예상대로 작동합니다 :

10 > 5 ? (puts "greater") : (puts "less")