2016-08-02 2 views
2
local a = {} 
local b = {} 

local c,d = (a~=nil) and 1,1 or 0,0 -- prints "1 1" 

local c,d = (a==nil) and 1,1 or 0,0 -- prints "false 1" 

print(c,d) 

나는 이런 일이 발생합니다. "0 0"을 인쇄하는 방법이 있습니까?루아 if 문 관용구

+1

사용 if 문 경우? –

+0

@Mooing Duck, 나는 "진술"이라고 싫어, 그들은 크고 추합니다. –

+1

또한 코드에서와 같이 바보 같은 실수를 방지합니다. 압축 된 코드 또는 실제로 작동하는 코드를 사용 하시겠습니까? –

답변

5

"0 0"을 인쇄 할 수있는 방법이 있습니까?

아니요. 왜냐하면 and or 표현식은 항상 하나의 결과를 반환하기 때문에 표시되는 결과는 아마도 사용자가 생각하는 이유 때문 만은 아닙니다.

로컬 C, D = (A ~ = 닐)와 1,1- 또는 0,0 - 인쇄 "1"이이 ((a~=nil) and 1),(1 or 0),0로 계산

. 첫 번째 표현식은 1을 반환하고 두 번째 표현식 (1 or 0)은 1을 반환하고 마지막 표현식은 무시됩니다 (왼쪽에 두 개의 변수가 있고 오른쪽에 세 개의 표현식이 있음).

로컬 C, D = (A == 전무) 및 1,1- 또는 0,0 - 인쇄 "FALSE 1"이이 유사한 방식으로 계산된다

, (a==nil)는 제외이다 false 그래서 당신은 두 번째 결과를 얻습니다.

원하는대로하려면 두 개의 표현식 (하나는 c이고 다른 하나는 d)로 나눠야합니다.

0

으로 그의 마지막 문장에서 "폴 Kulchenko"지적, 난 당신이 정말 가장 컴팩트 한 방법으로 가능한이 작업을 수행하려면 두 개의 숙어 ...

local a = {} 
local b = {} 

local c,d = (a~=nil) and 1 or 0, (a~=nil) and 1 or 0 -- prints "1 1" 

local c,d = (a==nil) and 1 or 0, (a==nil) and 1 or 0 -- prints "0 0" 

print(c,d) 
1

를 추가 결국, 당신은 만들 수 있습니다 그것을하는 함수. 일반적으로 조건 당 하나의 매개 변수 만 가져야하지만, 배수를 처리하는 매개 변수가 절대적으로 필요한 경우에는 두 가지 방법이 있습니다.

옵션 # 1 : 테이블을 가지고 : 분명히

function iff(cond, tbl1, tbl2) 
    if(cond) then 
    return unpack(tbl1) 
    else 
    return unpack(tbl2) 
    end 
end 

, 이것은 당신이 항상 테이블을 통과해야합니다. 단일 값만 필요하면 함수의 두 번째 버전이 필요합니다. 유형에 기반한 조건부 로직을 추가하는 것이 바람직하므로 코드가 느려집니다.

옵션 # 2 : 가변 인자 :

--Number of parameters ought to be even. 
--The first half are returned if the condition is true, 
--the second half if it is false. 
function iff(cond, ...) 
    if(cond) then 
    return ... --Yes, you're returning all of them, but the user shouldn't be trying to take more than the first half. 
    else 
    return select((select("#", ...))/2, ...) 
    end 
end