Lua
Booleany w Lua
Szukaj…
Uwagi
Booleany, prawda i fałsz są w Lua proste. Recenzować:
- Istnieje typ logiczny o dokładnie dwóch wartościach:
true
ifalse
. - W kontekście warunkowym (
if
,elseif
,while
,until
) wartość logiczna nie jest wymagana. Można użyć dowolnego wyrażenia. - W kontekście warunkowym
false
inil
liczone jako fałsz, a wszystko inne liczy się jako prawda. - 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:
false
inil
liczone jako false.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.