Поиск…


замечания

Булевы, истина и ложность прямолинейны в Lua. Для обзора:

  1. Существует логический тип с двумя значениями: true и false .
  2. В условном контексте ( if , elseif , while , until ) логическое значение не требуется. Можно использовать любое выражение.
  3. В условном контексте false и nil считаются ложными, а все остальное считается истинным.
  4. Хотя 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 может появляться в состоянии. Правила для оценки просты:

  1. false и nil считаются ложными.

  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
    

Логические операторы

В 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 построить.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow