Логические операции в языке Lua

Логические операторы and or not в lua

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

Программирование — это набор определенных правил. Наш код будет следовать строго описанным инструкциям. Логические операции очень важны так как с их помощью код будет выполнять одни либо другие действия.

В языке присутствует несколько логических операций:

and (И) — логическая операция И позволяет выполнять сравнение нескольких значений и возвращает истину только если все значения выполняются.

or (ИЛИ) — логическая операция ИЛИ позволяет выполнять сравнение нескольких значений и возвращает истину если одно из значений выполняется.

not (НЕ) — логическая операция НЕ является операцией отрицания. Этот оператор всегда возвращает либо Истина либо Ложь, первым делом происходит определение истинное значение или ложное поступает на вход, а потом возвращается противоположное значение. Пример может быть таким.

Если условие истинное, тогда вернуть Ложь. Если условие ложное тогда вернуть Истину. Если на входе число, значит это Истина, следовательно вернется Ложь. Если на входе nil, значит это Ложь, следовательно вернется Истина.

Использование логических операций лишь только на первый взгляд может показаться сложным занятием, на самом деле всё намного проще, главное знать основы, что делают эти операции, что я только что я и расписал.

Логические операции очень часто можно встретить в условных выражениях, более подробно о которых говорится в отдельной главе Условные выражения в языке lua.

Теперь поговорим как применяются логические операции.

local a = 10;

local b = 20;

local c = a or b;

message("Результат = " .. c);

В первых строках думаю всё понятно, обратите внимание на строку номер 5. Как видите мы объявили переменную с, а результат в неё помещаем либо значение переменной а, либо значение переменной b. В переменную c будет записано одно значение, а какое именно определяется следующим образом.

В переменную c записывается первое значение которое имеется. В данном примере переменная а содержит значение, значит это значение и будет записано в переменную c. Если в переменной а значение будет отсутствовать, значит в переменную c будет записано значение переменной b.

local a = nil;

local b = 20;

local c = 30;

local d = a or b or c;

message("Результат = " .. d);

Чуть более расширенный пример показывает что в переменную d записывается значение переменной b, так как переменная а не имеет значения. Надеюсь разобрались, двигаемся дальше.

А теперь рассмотрим пример с операцией and. Операция and возвращает первый параметр, если значение false или nil, иначе and возвращает второй параметр.

local a = 10;

local b = 20;

local c = a and b;

message("Результат = " .. c);

В этом примере переменная c будет иметь значение 20, так как первый параметр является истиной.

Если переменная а будет равна nil, тогда в переменную c будет записано первое значение, то есть тоже nil. Если переменная а будет содержать значение 10, тогда неважно чему равна переменная b, в переменную c будет записано второе значение (если переменная b равна nil, значит c будет иметь значение nil, если значение переменной b 20, значит значение переменной c тоже будет 20).

local a = 10;

local b = 20;

local c = 30;

local d = a and b and c;

message("Результат = " .. d);

И снова немного расширенный пример чтобы было более-менее понятно что происходит в коде.

В этом примере переменная d будет иметь значение 30. Теперь разберемся как так получается.

Вначале написано a and b, так как переменная a имеет значение, значит возвращается вторая часть, далее написано and c, так как переменная b тоже имеет значение, то возвращается следующая часть, а значит в переменную d записывается значение переменной c. Если переменная а будет иметь значение nil, тогда в переменную d также попадает значение nil, в связи с тем что возвращается первая часть. Если же переменная b будет иметь значение nil, тогда в переменную d будет записано значение nil, так как при сравнении b и c возвращается первая часть, то есть значение переменной b.

Если переменная c будет иметь значение nil. Тогда в переменную d будет записано значение nil, это связано с тем что при сравнении b и c, значение b имеется и возвращается вторая часть, то есть значение переменной c, а оно у нас nil.

Из этих примеров можно сделать вывод. Применяя логическую операцию or, можно получить из множества значений первое, которое будет являться значением.

Представьте ситуацию, имеется 10 переменных, некоторые из них могут иметь значение, а некоторые нет. Вы хотите получить первое, которое будет иметь значение, в этом случае можно воспользоваться логической операции or. Неважно какая именно переменная будет иметь значение, главное что вы не получите на выходе nil, если хотя бы одна переменная имеет значение.

Логическая операция and наоборот может вернуть последнее значение, но только в том случае если все переданные переменные имеют значения. Если хотя бы одна переменная не имеет значения, то на выходе вы получите nil. Данную операцию очень удобно использовать если вы хотите получить результат только в том случае, если все данные имеют значения.

local a = 10;

local b = 20;

local c = 30;

local d = a and b or c;

message("Результат = " .. d);

Вот еще один пример, чтобы вы лучше усвоили материал. В этом случае переменная d будет иметь значение 20. Происходит это следующим образом. Так как переменная а имеет значение, значит возвращается вторая часть, а так как далее используется операция or, то и возвращается значение 20.

local a = nil;

local b = 20;

local c = 30;

local d = a and b or c;

message("Результат = " .. d);

А вот этот пример возвращает значение 30. Если вы сейчас вникните как именно получилось значение 30, значит вы полностью разобрались с темой, смотрите внимательно.

Разбираемся поочередно. В начале описано a and b, ты как переменная а не имеет значение, то возвращается первая часть, то есть возвращается nil. Теперь необходимо сравнить nil or c, так как используется операция or, значит возвращается переменная которая имеет значение, то есть переменная c. В итоге у нас в переменную d помещается значение 30.

local a = 10;

local b = nil;

local c = 30;

local d = a and b or c;

message("Результат = " .. d);

В этом случае также в переменную d попадет значение 30, тут ничего не меняется, при сравнении a and b, возвращается nil и через операцию or сравнивается со значением c, в итоге на выходе значение c.

local a = 10;

local b = 20;

local c = nil;

local d = a and b or c;

message("Результат = " .. d);

И последняя возможная ситуация.

Тут в переменную d попадает значение 20. Работает это следующим образом. При сравнении a and b возвращается значение 20, а потом через оператор or 20 сравнивается со значением nil, а значит на выходе имеем 20.

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

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

Надеюсь вы разобрались с этой темой, но если все-таки возникают вопросы пишите их в комментариях.

Постоянная ссылка на это сообщение: https://k-pavel.ru/logicheskie-operacii-v-jazyke-lua/

avatar
2 Цепочка комментария
7 Ответы по цепочке
1 Последователи
 
Популярнейший комментарий
Цепочка актуального комментария
2 Авторы комментариев
ВладимирПавел КашинскийVladimir Авторы недавних комментариев

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  Subscribe  
Новые Старые Популярные
Подписаться на
Владимир
Гость
Владимир

Хорошо, что попал на Ваш сайт. Постараюсь разработать несколько индикаторов. А то всё приходится делать в экселе, вручную. Записывать данные баров, копировать строки с формулами, строить графики. Я в программировании вообще ничего не знаю. Но хочу научиться. ОЧЕНЬ. Буду признателен, если будете иногда отвечать на вопросы и оказывать помощь в этом деле.

Владимир
Гость
Владимир

Спасибо!!!

Vladimir
Гость
Vladimir

Павел, как использовать в индикаторе открытый интерес? И можно ли использовать OBV?

Владимир
Гость
Владимир

Это стандартный индикатор On Balance Volume. накопленный объём сделок. При отрицательных значениях бара объём бара отрицательный и вычитается из общего, а при положительных значениях бара — положительный и соответственно прибавляется к общему объёму. Хочу разработать индикатор POIV по Ларри Вильямсу. В excell вручную трудно и долго.

Владимир
Гость
Владимир

Справочник какой? Скиньте ссылку, если возможно.