2014-11-17 4 views
0

에없는이 비교 방식의 작업은이 "OR"비교 P가 포함되어 있기 때문에 진정한 반환하지만이 전 배열왜 루비

s = ['Armando','P'] 
p s[1] == ('R' || 'P' || 'S') 

에게 I 있다고 가정 해 봅시다 그러나 그것은 거짓

+0

논리가 수행하는 작업을 분석하려면 http://stackoverflow.com/a/26765267/128421을 참조하십시오. –

답변

1

문제는 표현 'R' || 'P' || 'S'가 'R'(로 평가 점이다 그것은 최초의 truthy 값 때문에 분명히 'P' != 'R'인데, 그 이유는 완전한 표현식이 false으로 평가되는 이유입니다. 대신 정규식을 사용하는 것입니다 :

# Revised regexp according to Cary Swoveland's recommendation: 
!!s[1][/\A[RPS]\z/] #=> true 
+0

앞에 2 개의 느낌표가 있습니까? – CodeCrack

+0

사실/허위 값을 'true'또는 'false'로 변환하는 것입니다. 그것들은 정말로 필요하지는 않지만, 그것들 없이는 [1] = ~/\ A [RPS] \ z/# => 0'입니다. 0을'true' 또는'nil'을'false'로 변환하려면 식 앞에'!!'([부울 부정 (boolean negation)]을 수행 할 수 있습니다 (http://www.ruby-doc.org/core -2.1.5/BasicObject.html # method-i-21) 두 번 사용). –

2

때문에를 반환 않습니다 그건 어떻게 작동하는지 아니야. A이 사실 일 경우 A || B의 정의는 A이며, 그렇지 않은 경우 B입니다. 평가 순서는 수학에서와 같이 괄호가 먼저 나옵니다. 그래서 ('R' || 'P' || 'S')'R'입니다 (적어도 첫 번째 것은 진실이므로 사실 모두 해당됩니다). 그렇다면 'P' == 'R'은 분명히 거짓입니다.

s[1] == 'R' || s[1] == 'P' || s[1] == 'S' 

짧은 대안 :

당신은로 작성해야

%w(R P S).include?(s[1]) 
+0

이것이'if' 문 안에 있다면'case s [i];라고 쓸 수도 있습니다. 'R', 'P', 'S'; 그때....; 그밖에...; 끝 '. –