Szukaj…


Uwagi

Booleany, prawda i fałsz są w Lua proste. Recenzować:

  1. Istnieje typ logiczny o dokładnie dwóch wartościach: true i false .
  2. W kontekście warunkowym ( if , elseif , while , until ) wartość logiczna nie jest wymagana. Można użyć dowolnego wyrażenia.
  3. W kontekście warunkowym false i nil liczone jako fałsz, a wszystko inne liczy się jako prawda.
  4. Chociaż 3 już to implikuje: jeśli pochodzisz z innych języków, pamiętaj, że 0 i pusty łańcuch liczą się jako prawdziwe w kontekstach warunkowych w Lua.

Typ boolowski

Wartości logiczne i inne wartości

W przypadku lua ważne jest rozróżnienie między wartościami logicznymi true i false oraz wartościami true lub false.

W lua są tylko dwie wartości, które dają w wyniku fałsz: nil i false , podczas gdy wszystko inne, w tym cyfra 0 wartość prawda.

Kilka przykładów tego, co to oznacza:

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.

Operacje logiczne

Operatory logiczne w lua niekoniecznie zwracają wartości logiczne:

and zwróci drugą wartość, jeśli pierwsza wartość będzie miała wartość true;

or zwraca drugą wartość, jeśli pierwsza wartość ma wartość false;

Umożliwia to symulację operatora trójskładnikowego, podobnie jak w innych językach:

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

Można to również wykorzystać do zainicjowania tabel, jeśli nie istnieją

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

lub aby uniknąć używania instrukcji if, dzięki czemu kod jest łatwiejszy do odczytania

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)

Sprawdzanie, czy zmienne są zdefiniowane

Można również łatwo sprawdzić, czy zmienna istnieje (jeśli jest zdefiniowana), ponieważ nieistniejące zmienne zwracają nil , co daje wartość false.

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

Jedynym przypadkiem, w którym nie ma to zastosowania, jest sytuacja, gdy zmienna przechowuje wartość false , w którym to przypadku technicznie istnieje, ale nadal przyjmuje wartość false. Z tego powodu źle jest tworzyć funkcje zwracające wartość false i nil zależności od stanu lub danych wejściowych. Nadal możemy jednak sprawdzić, czy mamy nil lub 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

Konteksty warunkowe

Konteksty warunkowe w Lua ( if , elseif , while , until ) nie wymagają wartości logicznej. Podobnie jak wiele języków, dowolna wartość Lua może pojawić się w warunku. Zasady oceny są proste:

  1. false i nil liczone jako false.

  2. Wszystko inne liczy się jako prawda.

    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
    

Operatory logiczne

W Lua booleanami można manipulować za pomocą operatorów logicznych . Tymi operatorami są not , and , i or .

W prostych wyrażeniach wyniki są dość proste:

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

Porządek pierwszeństwa

Kolejność pierwszeństwa jest podobna do operatorów matematycznych jednoargumentowych - , * i + :

  • not
  • wtedy and
  • wtedy or

Może to prowadzić do złożonych wyrażeń:

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

Skrótowa ocena

Operatory and / or mogą być oceniane tylko przy użyciu pierwszego operandu, pod warunkiem, że drugi nie jest konieczny:

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

Idiomatyczny operator warunkowy

W związku z pierwszeństwem operatorów logicznych, zdolność do oceny skrót oraz oceny nie- false i nie- nil wartości jak true , idiomatycznym operator warunkowy jest dostępny w 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

Ponadto, ze względu na naturę struktury x and a or b , a nigdy nie zostanie zwrócone, jeśli będzie miało wartość false , wówczas ten warunek zawsze zwróci b bez względu na to, czym jest x .

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

Tabele prawdy

Operatory logiczne w Lua nie „zwracają” wartości logicznej, ale jeden z ich argumentów. Używając nil dla false i liczb dla true, oto jak się zachowują.

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

Jak widać, Lua zawsze zwraca pierwszą wartość, która powoduje, że sprawdzenie się nie powiedzie lub zakończy się powodzeniem . Oto tabele prawdy, które to pokazują.

  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

Dla tych, którzy tego potrzebują, oto dwie funkcje reprezentujące te operatory logiczne.

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

Emulowanie operatora trójskładnikowego za pomocą „i” lub „operatorów logicznych”.

W lua operatory logiczne and i or zwraca jeden z operandów jako wynik zamiast wyniku logicznego. W konsekwencji mechanizm ten można wykorzystać do naśladowania zachowania operatora trójskładnikowego, mimo że Lua nie ma „prawdziwego” operatora trójskładnikowego w języku.

Składnia

warunek i truey_expr lub falsey_expr

Zastosowanie w przypisywaniu / inicjowaniu zmiennych

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

Użyj w konstruktorze tabel

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

Użyj jako argumentu funkcji

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

Użyj w oświadczeniu zwrotnym

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

Zastrzeżenie

Są sytuacje, w których ten mechanizm nie ma pożądanego zachowania. Rozważ tę sprawę

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

W „prawdziwym” operatorze trójskładnikowym oczekiwana wartość var jest false . W Lua, jednak and ewaluacja „spada przez” ponieważ drugi argument jest falsey. W rezultacie var kończy się na should not happen .

Dwa możliwe obejścia tego problemu: zmodyfikuj to wyrażenie, aby środkowy operand nie był falsey. na przykład.

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

lub alternatywnie, stosować klasyczny if then else konstrukcie.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow