Lua
Булевы в Lua
Поиск…
замечания
Булевы, истина и ложность прямолинейны в Lua. Для обзора:
- Существует логический тип с двумя значениями:
true
иfalse
. - В условном контексте (
if
,elseif
,while
,until
) логическое значение не требуется. Можно использовать любое выражение. - В условном контексте
false
иnil
считаются ложными, а все остальное считается истинным. - Хотя 3 уже подразумевает это: если вы исходите из других языков, помните, что
0
а пустая строка считается как true в условных контекстах в Lua.
Булевский тип
Булевы и другие значения
При работе с lua важно различать логические значения true
и false
и значения, которые оцениваются как true или false.
В lua есть только два значения, которые вычисляют false: nil
и false
, тогда как все остальное, включая числовое значение 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.
Логические операции
Логические операторы в lua необязательно возвращают логические значения:
and
вернет второе значение, если первое значение будет равно true;
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
, которое вычисляется как 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
Единственный случай, когда это не применяется, - это когда переменная хранит значение false
, и в этом случае оно технически существует, но все равно оценивается как false. Из-за этого плохой дизайн создает функции, которые возвращают false
и nil
зависимости от состояния или ввода. Мы все еще можем проверить, есть ли у нас 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
Условные контексты
Условные контексты в Lua ( if
, elseif
, while
, until
) не требуют булевых. Как и многие языки, любое значение Lua может появляться в состоянии. Правила для оценки просты:
false
иnil
считаются ложными.Все остальное считается истинным.
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
Логические операторы
В Lua логические операции можно манипулировать с помощью логических операторов . К этим операторам относятся not
, and
, и / or
.
В простых выражениях результаты довольно просты:
print(not true) --> false
print(not false) --> true
print(true or false) --> true
print(false and true) --> false
Приказ о приоритете
Порядок приоритета подобен математическим операторам унарный -
, *
и +
:
-
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
Краткосрочная оценка
Операторы and
or
могут быть оценены только с помощью первого операнда, если вторая не нужна:
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
Идиоматический условный оператор
Из - за приоритет логических операторов, возможность для оценки короткой резки и оценки , не являющихся false
и не- 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
Таблицы правды
Логические операторы в Lua не возвращают логическое значение, а один из аргументов. Используя nil
для false и числа для 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
Как вы можете видеть, Lua всегда будет возвращать первое значение, которое делает проверку неудачной или успешной . Вот таблицы правды, показывающие это.
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
Эмулирующий тернарный оператор с «и» или «логическими операторами».
В lua логические операторы and
or
возвращают один из операндов в качестве результата вместо логического результата. Как следствие, этот механизм можно использовать для подражания поведению тройного оператора, несмотря на то, что он не имеет «реального» тернарного оператора в языке.
Синтаксис
условие и правша_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")
Использовать в возвратной инструкции
function get_gradestring(student)
return student.grade > 60 and "pass" or "fail"
end
Предостережение
Бывают ситуации, когда этот механизм не имеет желаемого поведения. Рассмотрим этот случай
local var = true and false or "should not happen"
В «реальном» тернарном операторе ожидаемое значение var
является false
. В Lua, однако, and
оценка «проваливается» , потому что второй операнд falsey. В результате var
заканчивается, а should not happen
вместо этого.
Два возможных решения этой проблемы реорганизуют это выражение, поэтому средний операнд не является ложным. например.
local var = not true and "should not happen" or false
или, альтернативно, использовать классическую, if
then
else
построить.