2017-10-24 11 views
2

질문은루아 조건문

Lua 이어 :

local a = b or 0 
local a = b and 1 or 0 

B는 어떤 형태 일 수있는 위치.

코드 줄 사이의 차이점은 무엇입니까? 그리고 어떤 경우에 하나 또는 다른 것을 사용합니까?


컨텍스트

나는 다른 서비스에 Lua 코드를 기존 포트를하고 난 이유 코드의 일부 (나는 Lua 개발자 아니에요)에서, 변수를 이해하는 문제에 달렸다 코드의 한 부분과 다른 부분에 할당되면 변수가 다른 부분에 할당됩니다. 오른쪽에있는 변수는 입력 매개 변수이며 의도 한 유형을 알 수있는 방법이 없습니다. 나는이에 루아 문서를 온라인 보면서 나는이에 대한 명확한 답을 찾을 수 없습니다

을 시도 무엇


.

local a1; 
print(type(a1))    -- nil 
local b1 = a1 or 0    
print(b1 .. " " .. type(b1)) -- 0 number 
local c1 = a1 and 1 or 0 
print(c1 .. " " .. type(c1)) -- 0 number 

local a2 = 5 
print(type(a2))    -- number 
local b2 = a2 or 0   
print(b2 .. " " .. type(b2)) -- 5 number 
local c2 = a2 and 1 or 0 
print(c2 .. " " .. type(c2)) -- 1 number 

local a3 = 0 
print(type(a3))    -- number 
local b3 = a3 or 0   
print(b3 .. " " .. type(b3)) -- 0 number 
local c3 = a3 and 1 or 0 
print(c3 .. " " .. type(c3)) -- 1 number 

local a4 = false 
print(type(a4))    -- boolean 
local b4 = a4 or 0 
print(b4 .. " " .. type(b4)) -- 0 number 
local c4 = a4 and 1 or 0 
print(c4 .. " " .. type(c4)) -- 0 number 

local a5 = true 
print(type(a5))    -- boolean 
local b5 = a5 or 0 
print(b5 .. " " .. type(b5)) -- error, concatenating boolean to string 
local c5 = a5 and 1 or 0 
print(c5 .. " " .. type(c5)) -- 1 number 

local a6 = "str" 
print(type(a6))    -- string 
local b6 = a6 or 0 
print(b6 .. " " .. type(b6)) -- str string 
local c6 = a6 and 1 or 0 
print(c6 .. " " .. type(c6)) -- 1 number 

local a7 = "" 
print(type(a7))    -- string 
local b7 = a7 or 0 
print(b7 .. " " .. type(b7)) -- string 
local c7 = a7 and 1 or 0 
print(c7 .. " " .. type(c7)) -- 1 number 

b은 부울 또는 전무 타입이며 bnila 0 발생한다 때 and 조건과 코드의 라인에 대한 유일한 유스 케이스가 나에게 보인다 : 나는 내 자신의 테스트를 실행 또는 false이고 b가 true 인 경우 1입니다.

답변

2

루아에서는 단락 회로 평가를하는 선택 연산자입니다.

falsenil은 "거짓"입니다. 다른 모든 가치는 "진실"입니다. "거짓"을 제외하고 피연산자 유형은 중요하지 않으며 결과 유형은 반드시 "boolean" 일 필요가 없습니다.

  • or 선택한다 (리턴) 제 truthy 피연산자.

  • and은 false이면 첫 번째 피연산자를 선택하고, 그렇지 않으면 두 번째 피연산자를 선택합니다. 우선 순위는 or입니다.

이것은 몇 숙어 리드 : 당신의 두 예 사이

b or 0 -- default to 0 
t = t or {} -- existing or new, empty table 
b and 1 or 0 -- coerce to 1, defaulting to 0 

차이는 1로 강제 변환 초이고, 제는 "truthy"B가 될 수있다.