2013-09-02 3 views
1

, 코드처럼 찾아 합리적이다 루비 논리 연산자의 결과를 이해할 수루비에서

a = 1, b = 2, c = 3 

하지만 난 이해할 수없는 이유 코드와 같은 :

a = 1 && b = 2 && c = 3 
print "a = #{a}, b = #{b}, c = #{c}\n" 

결과는 다음과 같습니다

a = 3, b = 3, c = 3 

아무에게도 분명히 해 주실 수 있습니까?

+0

두 코드 모두 나를 단순히'SyntaxError'라고합니다. 나는 당신이보고있는 결과를 얻지 못한다. –

+0

앤드류를 편집 해 주셔서 감사합니다. 더 잘 어울립니다. – bean

답변

3

그러므로 and&& 연산자의 높은 우선 순위에 관하여 :

a = 1 && b = 2 && c = 3

가 할당

  1. 3 결과

    a = (1 and b = (2 and c = 3))

    동등 (3) 결과 c

  2. (2, 3)에 b
  3. (1, 3) (3)에서 발생하는 마지막 피연산자의 우선 순위에서 그렇다 a
+0

이것은 정말 도움이됩니다, 데이빗 감사합니다! – bean

+1

왜'2 && 3 == 3'이냐고 설명하지 마시오. – Borodin

+0

@Borodin 논리적'''과'''은 왼쪽 피연산자가'''true''로 평가 될 때만 오른쪽 인수를 평가합니다'' ''''''''''''''''를 제외한 객체입니다. 오른쪽 피연산자는 표현식의 결과입니다. 그러나 OP의 질문에 대한 답변에서 언급 될 필요는 없다고 생각합니다. –

0

할당되어,이 할당되고 동작은 로직 연산자 short-circuit evaluation의 결과입니다.

and을 evavating 할 때 첫 번째 피연산자가 false 인 것으로 판명되면 두 번째 피연산자를 평가할 이유가 없습니다. 따라서 a and b의 값은 a ? b : a으로 계산됩니다.

마찬가지로 or 연산자는 a ? a : b과 계약을 맺습니다.

이러한 최적화는 반환 된 특정 값에 대해 신경 쓰지 않고 사실인지 또는 거짓인지 만 논리적으로 잘 작동합니다. 그러나 그것은 또한 list = list || [] 때문에 작동

(list = list || []) << item 

이 (무 연산) list 사실 (nil이 아닌) 인 경우 list = list으로 평가, 또는 list = [] (새로운 빈 배열을 만드는 등, 유용한 코딩 숙어 수 있습니다) list이 이미 초기화되어 있고 이 "true"이면입니다.

그래서 2 and (c = 3) 같은 표현은 2 and 3 또는 2 ? 3 : 2, 그래서 3로 평가합니다.