Перейти к содержимому


Фотография

Логические выражения в lua или избавляемся от логических блоков


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 4

#1 Оффлайн   Ktlo

Ktlo
  • Пользователи
  • Сообщений: 115
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

                 

Отправлено 12 Август 2015 - 00:04

*
Популярное сообщение!

Решил написать немного о логических выражениях в Lua. Логические операции в Lua (в частности end и or) отличаются по возможностям с теми же операциями в других языках программирования. Во многом это зависит от того, что в Lua нет типов переменных (ну там всякие int, byte, short). Зная эти особенности, вы можете избавиться от ненужных логических блоков, но сначала следует разобраться, что они вообще делают и какие значения в lua истинные, а какие ложные.
Ложные значения - это nil и false, а всё остальное (таблицы, числа, сопрограммы, true) - истинные.

 

OR

Спойлер

AND
Спойлер

NOT
Спойлер
 

 

Теперь можно показать самые используемые выражения.

Наверняка у вас был случай, когда нужно, чтобы переменная приравнялась одному значению, а если его нет, то другому. Многие записали бы так:

if var == nil then
    var = 23
end

Это конечно работает, но не лучше ли записать так:

var = var or 23

Кратко и красиво, да к тому же нет лишнего логического блока. Вы также можете продолжить эту цепочку:

var = var or var2 or var3 or 23

В такой цепочке выражение вернёт первое истинное значение, при этом не трогая все те что за ним. Это значит, что вы спокойно можете сделать так:

var = var or error("Переменная var содержит ложное значение!")

И радовались бы дальше, но ведь иногда нам нужно, придать значение переменной в зависимости от истинности выражения. Не зная удобного способа, вы бы сделали так:

if var then
    var2 = 23
else
    var2 = 42
end

Но это можно записать без логического блока:

var2 = var and 23 or 42

Вы можете заменить переменную var любым выражением, но если вы плохо разбираетесь в приоритетах операторов рекомендую выделять скобками:

var2 = (var > 0) and 23 or 42 -- В данном примере скобки не обязательны

Теперь давайте основываясь на узнанном, напишем функцию с проверкой аргумента:

function func(var)
    var = type(var) == "number" and var == math.floor(var) and var or error("bad argument: celoe number expected, got "..var, 2)
end

И заметьте ни одного логического блока. В результате наша функция проверит является ли аргумент целым числом, иначе вернёт ошибку.

Бывает случай, когда необходимо проверить существует ли поле в таблице и выполнять действия в зависимости от этого, но ведь значение может быть не таблицей, из-за этого ошибка будет не пользователя а ваша. Я не буду приводить всякие отдельные случаи просто напишу само выражение:

if not (type(table) == "table" and table.field and ...) then -- ... - ваши логические выражения
    -- Какие-то действия
end

Ещё один важный момент, когда аргумент вашей функции может быть не указан, но потом внутри самой функции обретает значение типа boolean (true либо false) через оператор or это не выполнить, т.к. false - ложное значение, но можно воспользоваться следующими выражениями, в зависимости от того, что вам нужно:

var = var ~= false -- Если var = nil, то вернёт true, если переменная типа boolean не изменит её значения
var = not not var -- То же, что и первое, но при значении nil вернёт false

Думаю, что наиболее используемые моменты осветил, но если что-то не понятно, спрашивайте.

Ни один смайлик не использован


Сообщение отредактировал Ktlo: 12 Август 2015 - 11:32

  • 1Ridav, Zer0Galaxy, Fingercomp и 8 другим это нравится

#2 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 228
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 12 Август 2015 - 09:18

в частности end и or
наверное, все таки and 

#3 Оффлайн   unknown

unknown
  • Пользователи
  • Сообщений: 63
  • Уровень сигнала: 16,15%
  • В игре: 121 час. 36 мин.

Награды

        

Отправлено 12 Август 2015 - 11:03

function func(var)    var = type(var) == "number" and var == math.floor(var) and var or error("bad argument: celoe number expected, got "..var, 2)end
"celoe number" :smile3: :smile3: :facepalm:
целое – whole

#4 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 228
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 12 Август 2015 - 11:28

целое – whole
целое - integer 

#5 Оффлайн   unknown

unknown
  • Пользователи
  • Сообщений: 63
  • Уровень сигнала: 16,15%
  • В игре: 121 час. 36 мин.

Награды

        

Отправлено 12 Август 2015 - 11:31

целое - integer

Не могу не согласиться.




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных