Ktlo 789 Опубликовано: 11 августа, 2015 (изменено) Решил написать немного о логических выражениях в Lua. Логические операции в Lua (в частности end и or) отличаются по возможностям с теми же операциями в других языках программирования. Во многом это зависит от того, что в Lua нет типов переменных (ну там всякие int, byte, short). Зная эти особенности, вы можете избавиться от ненужных логических блоков, но сначала следует разобраться, что они вообще делают и какие значения в lua истинные, а какие ложные.Ложные значения - это nil и false, а всё остальное (таблицы, числа, сопрограммы, true) - истинные. OR Запись простого выражения: var = znach1 or znach2 Алгоритм:сначала оператор проверяет первое значение, если оно истинное, возвращает его, если ложное, то второе значение.Примеры: local znach1 = true local znach2 = false local var var = znach1 or znach2 -- Вернёт znach1, то-есть true var = znach2 or znach1 -- Вернёт znach1, то-есть true var = false or nil -- Вернёт nil AND Запись простого выражения: var = znach1 or znach2 Алгоритм:сначала оператор проверяет первое значение, если оно ложное, возвращает его, если истинное, то второе значение.Примеры: var = true and false -- Вернёт второе, то-есть false var = false and true -- Вернёт znach1, то-есть true var = true and 42 -- Вернёт второе, то-есть 42 var = nil and 42 -- Вернёт первое, то-есть nil var = false and nil -- Вернёт false NOT Запись простого выражения: var = not znach Алгоритм:оператор проверяет значение, если истинное, возвращает false, иначе true.Примеры: var = true and false -- Вернёт второе, то-есть false var = not false -- Вернёт true var = not true -- Вернёт false var = not nil -- Вернёт true var = not 42 -- Вернёт false var = not not 42 -- Вернёт true Теперь можно показать самые используемые выражения. Наверняка у вас был случай, когда нужно, чтобы переменная приравнялась одному значению, а если его нет, то другому. Многие записали бы так: 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 Думаю, что наиболее используемые моменты осветил, но если что-то не понятно, спрашивайте. [ok=Ни один смайлик не использован][/ok] Изменено 12 августа, 2015 пользователем Ktlo 11 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 12 августа, 2015 в частности end и or наверное, все таки and Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
unknown 23 Опубликовано: 12 августа, 2015 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: целое – whole Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 12 августа, 2015 целое – whole целое - integer 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
unknown 23 Опубликовано: 12 августа, 2015 целое - integerНе могу не согласиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах