, 코드처럼 찾아 합리적이다 루비 논리 연산자의 결과를 이해할 수루비에서
이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
아무에게도 분명히 해 주실 수 있습니까?
, 코드처럼 찾아 합리적이다 루비 논리 연산자의 결과를 이해할 수루비에서
이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
아무에게도 분명히 해 주실 수 있습니까?
그러므로 and
&&
연산자의 높은 우선 순위에 관하여 :
a = 1 && b = 2 && c = 3
가 할당
a = (1 and b = (2 and c = 3))
동등 (3) 결과 c
b
a
할당되어,이 할당되고 동작은 로직 연산자 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
로 평가합니다.
두 코드 모두 나를 단순히'SyntaxError'라고합니다. 나는 당신이보고있는 결과를 얻지 못한다. –
앤드류를 편집 해 주셔서 감사합니다. 더 잘 어울립니다. – bean