2012-07-25 5 views
13

변수가이 값과 같지 않은지 확인하려고합니다. 다음 코드를 사용해 보았지만 작동하지 않습니다.이 같지 않거나 루아에서 같음

if x ~=(0 or 1) then 
    print("X must be equal to 1 or 0") 
    return 
end 


if x ~= 0 or 1 then 
    print("X must be equal to 1 or 0") 
    return 
end 

방법이 있습니까?

테스트 두 값에 대한

답변

37

귀하의 문제는이 같은 프로그래밍 언어를 배우는 사람들에게 공통적 인 or 연산자의 오해에서 유래한다. 예, 즉각적인 문제는 x ~= 0 and x ~= 1으로 작성하여 해결할 수 있지만 시도한 솔루션이 작동하지 않는 이유에 대해 좀 더 자세하게 설명하겠습니다.

x ~=(0 or 1) 또는 x ~= 0 or 1을 읽을 때 "x는 0 또는 1과 같지 않습니다."문장처럼 자연 스럽습니다. 그 진술의 일반적인 이해에서, 주제는 "동일하지 않은 경우에" "X"술어 나 동사구, 및 "0 또는 1"은 개체, 접속사 합류 가능성의 집합입니다. 동사가있는 주제를 세트의 각 항목에 적용합니다.

그러나, 루아는이 영어 문법의 규칙에 따라,이 작업의 순서에 따라 두 가지 요소의 이진 비교에서 그것을 구문 분석 구문 분석하지 않습니다. 각 연산자에는 평가 될 순서를 결정하는 precedence이 있습니다. or는 수학 첨가 승산보다 낮은 우선 순위를 갖는 것처럼 ~=보다 낮은 우선 순위를 갖는다. 모든 것은 괄호보다 우선 순위가 낮습니다. 결과적 x ~=(0 or 1)을 평가할 때, 인터프리터 제 (인해 괄호) 0 or 1하고 x ~= 제 계산 결과를 계산할 것이며, 두 번째 예는 x ~= 0을 계산하고 결과를 적용로서는

그 계산은 or 1입니다.

logical operator or "는, 그렇지 않으면, 또는 두 번째 인자를 반환 값이 전무 거짓 다르면 첫 번째 인자를 반환한다." relational operator ~=은 항등 연산자 ==의 반대입니다. 그것은 일반적으로 인수를 비교 그렇지 않으면 인수가 다른 유형의 경우 (오른쪽 숫자입니다 x를?)가 true를 반환하고. 이러한 규칙을 사용

, x ~=(0 or 1)합니다 (or 연산자를 적용한 후) x ~= 0로 분해되며, 여기서 x는 바람직하지 않다 1을 포함하여 0 이외 인 경우에는이 '참'리턴한다. 다른 형태 x ~= 0 or 1 먼저 평가할 것이다 x ~= 0 (x의 값에 따라서, 참 또는 거짓 복귀 할 수 있음).그런 다음 false or 1 또는 true or 1 중 하나로 분해됩니다. 첫 번째 경우 문은 1을 반환하고 두 번째 경우 문은 true을 반환합니다. 루아의 제어 구조는 nilfalse만을 거짓으로 간주하고 다른 것이 참이 될 것이라고 생각하기 때문에 항상 if 문을 입력하게됩니다. 이는 어느 것이 든 원하지 않습니다.

프로그래밍 언어에서 제공되는 연산자와 같은 이진 연산자를 사용하여 단일 변수를 값 목록과 비교할 수는 없습니다. 대신 변수를 각 값과 하나씩 비교해야합니다. 이를 수행 할 수있는 몇 가지 방법이 있습니다. 가장 간단한 방법은 De Morgan's laws을 사용하여 2 진 연산자로 계산할 수없는 '1 또는 0이 아닌'진술을 표현할 수 있습니다. 이진 연산자로 쉽게 작성할 수있는 '1이 아닌 0'으로 표현할 수 있습니다.

원하지 않는 (당신은 x가 범위의 정수였다 테스트 한 후 범위를 확인하기 위해 관계 연산자를 사용할 수, 마지막으로

local x_is_ok = false 
for i = 0,1 do 
    if x == i then 
     x_is_ok = true 
    end 
end 
if not x_is_ok then 
    print("X must be equal to 1 or 0") 
    return 
end 

:

다른 방법으로,이 값을 확인하기 위해 루프를 사용할 수 있습니다 0.5, 맞습니까?)

if not (x >= 0 and x <= 1 and math.floor(x) == x) then 
    print("X must be equal to 1 or 0") 
    return 
end 

필자는 x >= 0 and x <= 1이라고 적었습니다. 위의 설명을 이해했다면 이제 왜 0 <= x <= 1을 쓰지 않았는 지 설명하고이 잘못된 표현이 반환 할 내용을 설명 할 수 있습니다.

+0

감사합니다. 완벽하게 설명합니다! – Ian

+2

프로그래밍 클래스를 가르쳐야합니다. :) – spirulence

+1

루아에 대해 많이 알지는 못하지만 드 모르간 (De Morgan)의 법에 대한 언급과 관련하여 '그렇치 않으면 (x == 1 또는 x == 0)'을 사용할 수 있다고 언급해야합니다. –

8

, 나는 개인적으로이 작업을 수행 할 것입니다 : 당신은 두 개 이상의 값에 대해 테스트해야하는 경우, 내가 한 세트처럼 행동 테이블에 선택 사항을 채울 것

if x ~= 0 and x ~= 1 then 
    print("X must be equal to 1 or 0") 
    return 
end 

처럼 그래서 :

choices = {[0]=true, [1]=true, [3]=true, [5]=true, [7]=true, [11]=true} 

if not choices[x] then 
    print("x must be in the first six prime numbers") 
    return 
end 
3

x ~= 0 or 1((x ~= 0) or 1)

x ~=(0 or 1) 같은 것은 (x ~= 0) 동일하다.

대신 다음과 같이 시도해보십시오.

function isNot0Or1(x) 
    return (x ~= 0 and x ~= 1) 
end 

print(isNot0Or1(-1) == true) 
print(isNot0Or1(0) == false) 
print(isNot0Or1(1) == false) 
관련 문제