수색…


비고

부울, 진리, 거짓은 루아에서 간단합니다. 검토:

  1. 정확히 두 값, 즉 truefalse 가진 부울 유형이 있습니다.
  2. 조건문 ( if , elseif , while , until )에서 부울은 필요하지 않습니다. 모든 표현식을 사용할 수 있습니다.
  3. 조건문에서 falsenil 은 false로 간주하고 나머지는 true로 계산합니다.
  4. 3은 이미 이것을 암시하지만 : 다른 언어를 사용하는 경우 Lua의 조건부 컨텍스트에서 0 과 빈 문자열 카운트가 참임을 기억하십시오.

부울 유형

부울 및 기타 값

루아를 처리 할 때는 부울 값 truefalse , 그리고 true 또는 false로 평가되는 값을 구별하는 것이 중요합니다.

lua에는 false로 평가되는 값이 두 개뿐입니다. 즉, nilfalse 를 제외한 나머지 모든 0 은 true로 평가됩니다.

이것이 의미하는 것의 몇 가지 예 :

if 0 then print("0 is true") end --> this will print "true"
if (2 == 3) then print("true") else print("false") end --> this prints "false"
if (2 == 3) == false then print("true") end --> this prints "true"
if (2 == 3) == nil then else print("false") end
--> prints false, because even if nil and false both evaluate to false,
--> they are still different things.

논리 연산

루아의 논리 연산자가 반드시 부울 값을 리턴하지는 않습니다.

and 첫 번째 값이 참으로 평가하는 경우 제 2 값을 리턴한다;

or 첫 번째 값이 false로 평가되면 두 번째 값을 반환합니다.

이렇게하면 다른 언어와 마찬가지로 삼항 연산자를 시뮬레이트 할 수 있습니다.

local var = false and 20 or 30 --> returns 30
local var = true and 20 or 30 --> returns 20
-- in C: false ? 20 : 30

테이블이 존재하지 않으면 테이블을 초기화하는데도 사용할 수 있습니다.

tab = tab or {} -- if tab already exists, nothing happens

또는 if 문을 사용하지 않으려면 코드를 읽기 쉽게 만들어야합니다.

print(debug and "there has been an error") -- prints "false" line if debug is false
debug and print("there has been an error") -- does nothing if debug is false
-- as you can see, the second way is preferable, because it does not output
-- anything if the condition is not met, but it is still possible.
-- also, note that the second expression returns false if debug is false,
-- and whatever print() returns if debug is true (in this case, print returns nil)

변수가 정의되어 있는지 확인하기

존재하지 않는 변수는 nil 리턴하기 때문에 (존재하는 변수가 존재한다면) 변수가 존재하는지 쉽게 확인할 수있다.

local tab_1, tab_2 = {}
if tab_1 then print("table 1 exists") end --> prints "table 1 exists"
if tab_2 then print("table 2 exists") end --> prints nothing

이것이 적용되지 않는 유일한 경우는 변수가 값 false 저장하는 경우입니다.이 경우 기술적으로 존재하지만 여전히 false로 평가됩니다. 이 때문에 상태 또는 입력에 따라 falsenil 을 반환하는 함수를 만드는 것은 좋지 않은 디자인입니다. 우리가 가지고 있는지 우리는 여전히하지만 확인하실 수 있습니다 nil 또는 false :

if nil == nil then print("A nil is present") else print("A nil is not present") end
if false == nil then print("A nil is present") else print("A nil is not present") end
-- The output of these calls are:
-- A nil is present!
-- A nil is not present

조건부 컨텍스트

루아의 조건문 ( if , elseif , while , until )은 부울을 필요로하지 않습니다. 여러 언어와 마찬가지로 Lua 값도 조건에 나타날 수 있습니다. 평가 규칙은 간단합니다.

  1. falsenil 은 false로 간주됩니다.

  2. 다른 모든 것은 사실로 간주됩니다.

    if 1 then
      print("Numbers work.")
    end
    if 0 then
      print("Even 0 is true")
    end
    
    if "strings work" then
      print("Strings work.")
    end
    if "" then
      print("Even the empty string is true.")
    end
    

논리 연산자

루아에서는 논리 연산자를 통해 부울을 조작 할 수 있습니다. 이 연산자에는 not , andor 됩니다.

간단한 표현식에서 결과는 매우 간단합니다.

print(not true) --> false
print(not false) --> true
print(true or false) --> true
print(false and true) --> false

우선 순위

우선 순위는 수학 연산자 인 unary - , *+ 와 유사합니다.

  • not
  • 그 다음 and
  • 다음 or

이것은 복잡한 표현으로 이어질 수 있습니다 :

print(true and false or not false and not true)
print( (true and false) or ((not false) and (not true)) )
    --> these are equivalent, and both evaluate to false

지름길 평가

첫 번째 피연산자와 두 번째 피연산자가 필요하지 않은 경우에만 andor 연산자를 평가할 수 있습니다.

function a()
    print("a() was called")
    return true
end

function b()
    print("b() was called")
    return false
end

print(a() or b())
    --> a() was called
    --> true
    --  nothing else
print(b() and a())
    --> b() was called
    --> false
    --  nothing else
print(a() and b())
    --> a() was called
    --> b() was called
    --> false

관용 조건부 연산자

논리적 연산자의 우선 순위, 즉 단축 평가 기능과 비 (non) false 및 non- nil 값을 true 로 평가하기 때문에 Lua에서는 관용적 조건부 연산자를 사용할 수 있습니다.

function a()
    print("a() was called")
    return false
end
function b()
    print("b() was called")
    return true
end
function c()
    print("c() was called")
    return 7
end

print(a() and b() or c())
    --> a() was called
    --> c() was called
    --> 7
    
print(b() and c() or a())
    --> b() was called
    --> c() was called
    --> 7

또한, 인해의 특성으로 x and a or b 구조, a 가로 평가되면 반환되지 않습니다 false ,이 조건 의지는 항상 반환하지 b 상관없이 x 입니다.

print(true and false or 1)  -- outputs 1

진실 표

루아의 논리 연산자는 부울을 "반환"하지 않고 인수 중 하나를 반환합니다. false에 nil 을 사용하고 true에 숫자를 사용하면 다음과 같이 동작합니다.

print(nil and nil)       -- nil
print(nil and 2)         -- nil
print(1 and nil)         -- nil
print(1 and 2)           -- 2

print(nil or nil)        -- nil
print(nil or 2)          -- 2
print(1 or nil)          -- 1
print(1 or 2)            -- 1

보시다시피 루아는 항상 검사를 실패 또는 성공 하게하는 첫 번째 값을 반환합니다. 그 사실을 보여주는 진리표가 있습니다.

  x  |  y  || and            x  |  y  || or
------------------         ------------------
false|false||  x           false|false||  y   
false|true ||  x           false|true ||  y   
true |false||  y           true |false||  x   
true |true ||  y           true |true ||  x

필요한 사람들을 위해,이 논리 연산자를 나타내는 두 가지 함수가 있습니다.

function exampleAnd(value1, value2)
  if value1 then
    return value2
  end
  return value1
end

function exampleOr(value1, value2)
  if value1 then
    return value1
  end
  return value2
end

'및' '또는'논리 연산자로 삼항 연산자를 에뮬레이션합니다.

루아에서는 논리 연산자 인 andor 가 부울 결과 대신 피연산자 중 하나를 결과로 반환합니다. 결과적으로,이 메커니즘은 언어에서 '실제'삼항 연산자가없는 루아에도 불구하고 삼항 연산자의 동작을 에뮬레이션하기 위해 악용 될 수 있습니다.

통사론

조건 truthy_expr 또는 falsey_expr

변수 할당 / 초기화에 사용

local drink = (fruit == "apple") and "apple juice" or "water"

테이블 생성자에서 사용

local menu =
{
  meal  = vegan and "carrot" or "steak",
  drink = vegan and "tea"    or "chicken soup"
}

함수 인수로 사용

print(age > 18 and "beer" or "fruit punch")

return 문에서 사용

function get_gradestring(student)
  return student.grade > 60 and "pass" or "fail"
end

경고

이 메커니즘에 원하는 동작이없는 상황이 있습니다. 이 경우를 생각해 보라.

local var = true and false or "should not happen"

'실제'삼항 연산자에서 기대되는 var 값은 false 입니다. 그러나 루아에서는 두 번째 피연산자가 거짓이므로 평가 and 평가가 '실패'합니다. 결과적으로 varvarshould not happen .

이 문제에 대한 두 가지 가능한 해결 방법은이 표현식을 리팩터링하여 중간 피연산자가 거짓이 아니도록하는 것입니다. 예.

local var = not true and "should not happen" or false

또는 대안 적으로 if then else 구조 then 사용하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow