Как сделать луа на нимб

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Установка lua это вопрос, который возникает достаточно часто. Что, вообще-то, достаточно удивительно, потому как установка lua на самом деле, крайне проста и понятна. Можно даже сказать, что там вообще нечего делать. Но, раз уж такие вопросы возникают, давайте немного поговорим об установке Lua.

Установка Луа. Скачиваем

Установка Луа. Компиляция.

Есть два варианта компиляции луа, которые, в принципе, ничем не отличаются ))) Первый – это компиляция из Visual Studio Command Prompt:

  1. Запускаем Visual Studio
  2. Выполняем Tools->Visual Studio Command Prompt
  3. Переходим в папку с луа, в директорию etc. Вот так: cd D:/mylibs/lua-5.1.4
  4. запускаем скрипт компиляции луа: etc/luavs.bat
  5. Мы получили нужны нам файлы lua.exe и luac.exe

Второй способ без запуска Visual Studio:

  1. В любом файл-мендеже (я лично работаю в FAR ) заходим в папку где_луа/etc/
  2. Редактируем файл, первой строкой ставим: call “путь_к_вижуалстудио/VC/bin/vcvars32.bat”
  3. Добавляем вторую строку: cd .. и сохраняем файл
  4. Запускаем, получаем искомые экзешники

Установка Луа. Доступ

Что бы вы могли запускать луа откуда угодно – вам надо добавить их (путь к ним) в переменную окружения %PATH%. Думаю, Вы сами прекрасно знаете как это сделать. В любом случае, нам не нужны эти файлы, т.к. мы планируем использовать луа внтри наших программ, а не как отдельное приложение. После этого считайте, что сама установка Lua завершена, вам лишь остаётся прописать в Visual Studio пути в получившейся .lib и хидерам луа.

Установка Луа. Статическая линковка.

Меня лично выводит из себя то, что с каждый проектом, использующим луа, приходится таскать и lua.dll , поскольку без неё программы работать не будут. А что бы они работали – надо что бы луа линковалась с нашей программой статически. Делается это тоже совсем не сложно:

  1. Делаем в Visual Studio новый проект, Win32Project, назовём его “LuaLib”
  2. Тип проекта указываем “Static Library”, отключаем использование Precompiled Header, нажимаем Finish
  3. Добавляем в проект все файлы .h и .c, кроме lua.c и luac.c
  4. Что бы компилятор не выдавал нам варнингов, в настройки проекта (Protec/Propreties/Preprocessor) добавляем ;_CRT_SECURE_NO_WARNINGS (не забудьте сделать это и для релиз и для дебаг-версии. )
  5. В настройках линковки (Project/Properties/Librarian/General/OutputFile) указываем какие имена библиотек мы хотим. Я указал lua.lib для релиза и lua-debug.lib для дебага.
  6. Компилируем дебаг и релиз-версии. Получаем нужные нам либы
  7. Прописываем пути к ним в Visual Studio

Установка Луа. Проверка.

Проверим, всё ли работает. Создаём новый проект (я сделал консольный проект win32). Дописываем инклюды луа:

и доделываем сам main():

В настройки линковщика (Project/Properties/Linker/Input/Addition Dependencies) не забываем добавить нашу библиотеку (lua.lib для релиза и lua-debug.lib для дебага). Компилируем. Создаём тестовый файлик с луа-скриптом:

Установка Lua. Проверка.

Запускаем и видим то, что и хотели. Теперь мы можем использовать Луа в наших программах и не таскать с собой этот ненавистный lua.dll – мне кажется, что это намного удобнее и приятнее )

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

В следующих уроках мы более подробно поговорим про использование луа-скриптов в программах и, в частности, в играх.

Автор, спасибо, хорошая статья, всё работает!

Не за что Очень рад, что у Вас всё получилось!

Да только что-то, под MSVC 2010 не могу скопилить, хотя либы подключил…

Что говорит? Какие ошибки?

Спасибо гуглу, за то, что я смог повторить то же самое в xcode.

Василий подскажи сайт где описано как подключить lua к xcode. А то ничего толкового найти не могу.

А как на счет компиляции LUA ? Будут статьи?

Папку с lua распаковал в диск С

Setting environment for using Microsoft Visual Studio 2010 x86 tools.

c:\program files\microsoft visual studio 10.0\vc\bin>cd C:/lua-5.1.4

C:\lua-5.1.4>etc
“etc” не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\lua-5.1.4>/etc
“/etc” не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\lua-5.1.4\etc>cd C:/lua-5.1.4/etc/luavs
Системе не удается найти указанный путь.

C:\lua-5.1.4\etc>cd src
Системе не удается найти указанный путь.

C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /DLUA_BUIL
D_AS_DLL l*.c
l*.c
c1 : fatal error C1083: Не удается открыть файл источник: l*.c: Invalid argument

C:\lua-5.1.4\etc>del lua.obj luac.obj
Не удается найти C:\lua-5.1.4\etc\lua.obj

C:\lua-5.1.4\etc>link /nologo /DLL /out:lua51.dll l*.obj
LINK : warning LNK4001: не указаны объектные файлы; использованы библиотеки
LINK : warning LNK4068: параметр /MACHINE не указан; принимается по умолчанию на
X86
LINK : error LNK2001: неразрешенный внешний символ “__DllMainCRTStartup@12″
lua51.dll : fatal error LNK1120: 1 неразрешенных внешних элементов

C:\lua-5.1.4\etc>if exist lua51.dll.manifest mt /nologo -manifest lua51.dll.mani
fest -outputresource:lua51.dll;2

C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /DLUA_BUIL
D_AS_DLL lua.c
lua.c
c1 : fatal error C1083: Не удается открыть файл источник: lua.c: No such file or
directory

C:\lua-5.1.4\etc>link /nologo /out:lua.exe lua.obj lua51.lib
LINK : fatal error LNK1181: не удается открыть входной файл “lua.obj”

C:\lua-5.1.4\etc>if exist lua.exe.manifest mt /nologo -manifest lua.exe.manifest
-outputresource:lua.exe

C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE l*.c print
.c
l*.c
c1 : fatal error C1083: Не удается открыть файл источник: l*.c: Invalid argument

print.c
c1 : fatal error C1083: Не удается открыть файл источник: print.c: No such file
or directory
Создание кода…

C:\lua-5.1.4\etc>del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathl
ib.obj loslib.obj ltablib.obj lstrlib.obj loadlib.obj
Не удается найти C:\lua-5.1.4\etc\lua.obj

C:\lua-5.1.4\etc>link /nologo /out:luac.exe *.obj
LINK : warning LNK4001: не указаны объектные файлы; использованы библиотеки
LINK : warning LNK4068: параметр /MACHINE не указан; принимается по умолчанию на
X86
LINK : fatal error LNK1561: точка входа должна быть определена

C:\lua-5.1.4\etc>if exist luac.exe.manifest mt /nologo -manifest luac.exe.manife
st -outputresource:luac.exe

C:\lua-5.1.4\etc>del *.obj *.manifest
Не удается найти C:\lua-5.1.4\etc\*.obj

Откуда инфа, интересно.

Не открываются.
Реализация всех хуков и методов все равно на С++ писана.
Возможности абсолютно те же, только преподнесены иначе и в урезанном виде.
С тем же успехом можно было бы и SAI расширить разница была бы только в читаемости кода (ну еще скорости, да).

Проект Eluna Engine, конечно, интересен, но не более того.

Arcanum Core © Dev.
Для запросов на выдачу наград/снятие замечаний есть темы в Работе Портала. Не пишите по этому поводу в личку.

Разбираюсь в компиляции, и установке серверов с ядрами СMaNGoS и Trinity.
Учусь модкрафтить (DBC-Edit, Локации в Noggit, Конвертирование/редактирование моделей в 3D-Max + Blender).
Интересуюсь технологиями, информатикой, физикой, и многим другим.
Warlocks 'Evil Empire'

Разбираюсь в компиляции, и установке серверов с ядрами СMaNGoS и Trinity.
Учусь модкрафтить (DBC-Edit, Локации в Noggit, Конвертирование/редактирование моделей в 3D-Max + Blender).
Интересуюсь технологиями, информатикой, физикой, и многим другим.
Warlocks 'Evil Empire'

Написать на чем?

LUA интерпретированный язык, ему, как бы это странно не звучало, нужен интерпретатор.
В данном случае им является все то же ядро trinity, и реализация этого интерпретирования в нем написана на С++ (компилируемом языке).
Так вот, если в ядре не будет реализации интерпретации для нужного метода или хука, то и в LUA скриптах вы его не сможете применить.
Вывод: на луа, в данном случае, НЕЛЬЗЯ написать то, что нельзя написать на С++.

Arcanum Core © Dev.
Для запросов на выдачу наград/снятие замечаний есть темы в Работе Портала. Не пишите по этому поводу в личку.

Dimitro, Не каждому человеку хватит сил выучить С++, а Lua на много проще. Поэтому новеньким, которые не хотят учить С++, проще реализовать свою идею на Lua. Тем более я уже пишу гайды, по разработке аддонов для WoW.


Прикрутить можно куда угодно. Вопрос будет стоять по другому: "Сколько времени придется потратить и сколько строчек кода нужно будет переписать".

Если бы в оф. репо тринити была бы поддержка lua я бы слова не сказал по поводу раздутия такой важности этой темы (статья на главной).
На данный момент ее там нет и в ближайшем будущем не будет.

Зачем выносить на главную гайды по левой модификации, которую еще нужно и перетащить в текущее ядро, для чего знания с++ могут и понадобиться и новичок это не осилит точно?
Про допиливание этой модификации я вообще молчу (ну да, надо с++ знать).

По этой логике, можно по любому кастом патчу или всему, что удастся связать с вовом размещать никому не нужные статьи на главной.
То есть если я, к примеру, реализую в ядре возможность писать скрипты на Brainfuck'e мне тоже статью на главную запилить по эзотерическим языкам программирования?

Даже если опустить предыдущие тезисы, смысл гайда на данный момент такой - "я скриптую сервера вов на луа, вот ссылка на сайт разработчиков мода, дальше разбирайтесь как хотите, гайды я начал делать с середины, недостатки системы объяснять не буду, как ее перетащить на ядро тоже не буду объяснять, зато я гайд по скриптингу для НОВИЧКОВ сделал".
Как новичкам дойти до стадии, когда можно будет так скриптовать, зачем это им нужно, какие преимущества и недостатки - не ясно.

Arcanum Core © Dev.
Для запросов на выдачу наград/снятие замечаний есть темы в Работе Портала. Не пишите по этому поводу в личку.

Если бы в оф. репо тринити была бы поддержка lua я бы слова не сказал по поводу раздутия такой важности этой темы (статья на главной).
На данный момент ее там нет и в ближайшем будущем не будет.

Зачем выносить на главную гайды по левой модификации, которую еще нужно и перетащить в текущее ядро, для чего знания с++ могут и понадобиться и новичок это не осилит точно?
Про допиливание этой модификации я вообще молчу (ну да, надо с++ знать).

По этой логике, можно по любому кастом патчу или всему, что удастся связать с вовом размещать никому не нужные статьи на главной.
То есть если я, к примеру, реализую в ядре возможность писать скрипты на Brainfuck'e мне тоже статью на главную запилить по эзотерическим языкам программирования?

Я не собирался раздувать "важность" данной темы. Я лично не знаю С++, но это мне не мешает работать на UWoW и писать при этом боссов.
Насчет реализации "сторонних" языков в ядре Trinity или любых других ядрах. Lua - один из самых легких и гибких языков. Тем самым его интеграция в ядро будет более уместной чем Brainfuck".
Да и вести спор насчет "Что легче и правильней?" в данной теме будет как минимум глупо. Данная тема - не призыв к использованию Elun'ы везде, а лишь небольшой гайд, показывающий новые возможности в реализации своих идей.

Инфа из снифера 100%

На wow-cool весь ДД на луа.
И еще 4 инста, ~ 120КВ.
Правда пришлось усовершенствовать саму Eluny

Как новичкам дойти до стадии, когда можно будет так скриптовать, зачем это им нужно, какие преимущества и недостатки - не ясно.


Думаю что очень скоро ты или СергейСВ выложите сбоку с встроенной lua, СергейСВ точно не упустит шанс продать пару десятков сборок.

Даже если опустить предыдущие тезисы, смысл гайда на данный момент такой - "я скриптую сервера вов на луа, вот ссылка на сайт разработчиков мода, дальше разбирайтесь как хотите, гайды я начал делать с середины, недостатки системы объяснять не буду, как ее перетащить на ядро тоже не буду объяснять, зато я гайд по скриптингу для НОВИЧКОВ сделал".
Как новичкам дойти до стадии, когда можно будет так скриптовать, зачем это им нужно, какие преимущества и недостатки - не ясно.

В интернете есть очень много гайдов на тему "Как поставить Eluna на Trinity". Даже скачав Eluna с офф репо и скомпилировав её - мы получим последнюю ревизию Trinity уже со встроенной Eluna. Сложностей в этом не возникнет ни у кого.
Недостатки? Они есть везде. На мой взгляд недостаток - дефицит некоторых функций. Но это уже решается дописыванием функционала со стороны С++. Этим уже будут заниматься другие люди, разрабатывающие Eluna.
Преимуществ, даже на первый взгляд, намного больше, чем недостатков. Тот факт, что можно писать скрипт, без перезагрузки/рекомпиляции сервера - перевешивает любые негативные восклицания.
Изменив скрипт в С++ мы ждем от 1-40 минут, пока проект не соберется и еще пару минут на запуск сервера/заход в игру.
На Lua мы лишь сохранили файл, прописали в консоль пару слов и уже может проверять его работоспособность.
Вносить правки в режиме онлайн - это огромный шаг в плане разработки и построении модели любого скрипта.



Луа Raid Shadow Legends – это герой из союза “Падшие” фракции “Темные Эльфы”. Ее основная роль в команде – Атака. Этот герой очень полезен в атаке на Арене и при прохождении Кампании. Своими умениями она способна игнорировать щит противника и блок урона.

Описание

Луа Raid Shadow Legends – это герой из союза “Падшие” фракции “Темные Эльфы”. Ее основная роль в команде – Атака. Этот герой очень полезен в атаке на Арене и при прохождении Кампании. Своими умениями она способна игнорировать щит противника и блок урона. Ей подойдут сеты на атаку, похищение жизни и скорость.

Видео-гайд на героя Луа Raid Shadow Legends

Детали

Навыки


Оценки

Таланты

Рекомендованные таланты для героя в PvE


Рекомендованные таланты для героя в PvP


Предметы

Сеты для героя Луа на Арену включают в себя – 2 сета на атаку, 1 на скорость

Сеты для героя Луа в PvE включают в себя – 1 сет похищения жизни, 1 на скорость

Сборки

1) Собрана на арену/подземелья. Спасибо @jester5500 за сборку.

Перчатки на крит урон, доспех на атаку, сапоги на скорость. Кольцо на атаку, ожерелье на крит урон, баннер на атаку.



2) Собрана на арену и подземелья.

Перчатки на крит урон, доспех на атаку, сапоги на атаку. Кольцо на атаку, ожерельн на крит урон, баннер на атаку.



1 отзыв на Луа

whirlwind52 – 08.03.2021

Отличный эпик, баланс характеристик сильно смещён в сторону атаки а потому героиня имеет крайне низкую базу защиты и ниже среднего базу здоровья. Набор навыков замечательный – полуАОЕшка с базы, тройная массуха и пробивающее щит обнуление полоски хода, множители на навыках достаточно высокие – прибавляем к этому высокую базу атаки и делаем вывод – эта барышня может очень и очень больно бить. Заходит просто везде – две массухи хорошо помогают зачищать волны в подземельях и Войнах Фракций, а её а3 хорошо пробивает жирных тяжеловесов как на арене, так и на нижних этажах крипты плюс ко всему она войдовая а потому слабых ударов можно не ждать.
Книги желательно в неё влить – неплохо поднимают урон с навыков и уменьшают перезарядку её небазовых навыков а это всегда приятно.
Одевать её как типичного героя атаки – КШ, КУ, атака, игнор брони, парирование, добрать ей хотя бы 200 меткости (или не добирать, если сокращение шкалы вам не нужно), в Кражу жизни в целом можно и не одевать – она достойно отхиливается со своего а2, учитывая её АОЕшную базу с условием то ей нужно иметь 100% Крит Шанс и в довесок можно нацепить сет оглушения – будет неплохо держать врагов в контроле которых сходу не может убить, что хорошо смотрится в Башне Рока.
Таланты есть смысл ей качать только если она выпала вам на начальном этапе игры когда более достойных аналогов пока нет.
Минусы – крайне тощая и хилая, нет ниодного штрафа

Еще

Написанный на Lua скрипт не имеет какой-либо специальной функции, с которой начиналось бы его выполнение. Скрипт можно рассматривать просто как набор команд (инструкций), который выполняется, начиная с первой инструкции.

Скрипт может быть как очень простым, состоящим всего из одной команды, так и весьма сложным, содержащим десятки, сотни и даже тысячи инструкций. Следующие друг за другом инструкции могут разделяться точкой с запятой (;). Однако это требование не является обязательным, поэтому весь приведённый ниже код является корректным с точки зрения синтаксиса:

Работа с переменными в Lua

Переменные используются для хранения значений в процессе выполнения скрипта.

Имена переменных в Lua

Именами (идентификаторами) переменных в Lua могут быть любые последовательности из букв, цифр и символа подчеркивания, начинающиеся не с цифры.

Язык Lua различает регистр символов, поэтому abc, Abc, ABC являются различными именами.

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

and break do else elseif

end false for function if

in local nil not or

repeat return then true until

Кроме того, все имена, начинающиеся с символа подчеркивания, за которым идут заглавные буквы (например, _VERSION) также являются зарезервированными.

Какие переменные бывают в Lua?

Переменные в Lua могут быть глобальными и локальными. Если переменная не объявлена явно как локальная, она считается глобальной.

Глобальные переменные Lua

Глобальная переменная появляется в момент присваивания ей первого значения. До присваивания первого значения обращение к глобальной переменной даёт nil.

MsgBox(tostring (g)) --> nil

MsgBox(tostring (g)) --> 1

Глобальная переменная существует до тех пор, пока существует среда исполнения скрипта и доступна любому Lua-коду, выполняемому в этой среде.

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

g = 1 — создаем глобальную переменную g со значением 1

g = nil — удаляем глобальную переменную g

MsgBox(tostring (g)) --> nil

Все глобальные переменные являются полями обычной таблицы, называемой глобальным окружением. Эта таблица доступна через глобальную переменную _G. Поскольку полями глобального окружения являются все глобальные переменные (включая саму _G), то _G._G == _G.

Локальные переменные Lua

Любые локальные переменные должны быть объявлены явно с использованием ключевого слова local. Объявить локальную переменную можно в любом месте скрипта. Объявление может включать в себя присваивание переменной начального значения. Если значение не присвоено, переменная содержит nil.

local a — объявляем локальную переменную a

local b = 1 — объявляем локальную переменную b, присваиваем ей значение 1

local c, d = 2, 3 — объявляем локальные переменные c и d, присваиваем им значения 2 и 3

Область видимости локальной переменной начинается после объявления и продолжается до конца блока.

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

Под блоком понимается:

тело управляющей конструкции (if-then, else, for, while, repeat);

фрагмент кода, заключённый в ключевые слова do. end.

Если локальная переменная определена вне какого-либо блока, её область видимости распространяется до конца скрипта.

a = 5 — глобальная переменная a

local i = 1 — переменная i локальна в пределах скрипта

while i 1, 4, 9, 16, 25

MsgBox(a) --> 5 (здесь обращение к глобальной a)

local a — переменная а локальна внутри then

MsgBox(a) --> 5 (здесь обращение к глобальной a)

local a = 20 — переменная а локальна внутри do-end

MsgBox(a) --> 5 (здесь обращение к глобальной a)

Типы данных Lua

Какие типы данных поддерживает язык Lua?

Lua поддерживает следующие типы данных:

1. Nil (ничего). Соответствует отсутствию у переменной значения. Этот тип представлен единственным значением — nil.

2. Boolean (логический). К данному типу относятся значения false (ложь) и true (истина).

При выполнении логических операций значение nil рассматривается как false. Все остальные значения, включая число 0 и пустую строку, рассматриваются как true.

3. Number (числовой). Служит для представления числовых значений.

Примеры допустимых числовых констант: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

4. String (строковый). Служит для представления строк.

Строковые значения задаются в виде последовательности символов, заключённой в одинарные или двойные кавычки:

b = 'это вторая строка'

\n (перевод строки),

\r (возврат каретки);

\t (горизонтальная табуляция),

Символ в строке также может быть представлен своим кодом с помощью escape-последовательности:

где ddd — последовательность из не более чем трёх цифр.

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

Определение строки с помощью двойных квадратных скобок позволяет игнорировать все escape-последовательности, т. е. строка создаётся полностью так, как описана:

local a = [[string

При определении строки с помощью двойных квадратных скобок учитываются символы табуляции и переноса.

local a = [=[определение строки [[string]] в Lua]=]

5. Function (функция). Функции в Lua могут быть записаны в переменные, переданы как параметры в другие функции ивозвращены как результат выполнения функций.

7. Userdata (пользовательские данные). Является особым типом данных. Значения этого типа не могут быть созданы или изменены непосредственно в Lua-скрипте.

банки данных (класс Bank);

базы данных (класс Base);

записи (класс Record) и т. п.

8. Thread (поток). Соответствует потоку выполнения. Эти потоки никаким образом не связаны с операционной системой и поддерживаются исключительно средствами самого Lua.

Как в Lua задать тип переменной?

Lua не предусматривает явного задания типа переменной. Тип переменной устанавливается в момент присвоения переменной значения. Любой переменной может быть присвоено значение любого типа (вне зависимости от того, значение какого типа она содержала ранее).

a = 123 — переменная a имеет тип number

a = true — теперь переменная a имеет тип boolean

a = <> — теперь переменная a имеет тип table

Переменные типа table, function, thread и userdata не содержат самих данных, а хранят ссылки на соответствующие объекты. При присваивании, передачи в функцию в качестве аргумента и возвращении из функции в качестве результата копирования объектов не происходит, копируются только ссылки на них.

a = <> — создаем таблицу. В переменную a помещается ссылка на таблицу

b = a — переменная b ссылается на ту же таблицу, что и a

a[1] = 10 — элементу таблицы с индексом 1 присвоено значение 10

Остальные данные являются непосредственными значениями.

Как в Lua получить тип переменной?

Как в Lua преобразовать тип переменной?

Lua при необходимости автоматически преобразует числа в строки и наоборот. Например, если строковое значение является операндом в арифметической операции, оно преобразуется в число. Аналогично числовое значение, встретившееся в том месте, где ожидается строковое, будет преобразовано в строку.

Значение любого типа можно явным образом преобразовать в строку с помощью стандартной функции tostring.

Из предыдущего примера видно, что содержимое таблиц функцией tostring не преобразуется. Выполнить такое преобразование можно с помощью функции render.

Для явного преобразования значения в число можно использовать стандартную функцию tonumber. Если значение является строкой, которую можно преобразовать в число (или уже является числом), функция возвращает результат преобразования, в противном случае возвращает nil.

Расстановка комментариев в Lua

local a = 1 — однострочный комментарий

local a = 1 — [[ многострочный

Двойные скобки в комментариях могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется знак равенства (=):

local a = [=[определение некоторой строки [[string]] в языке Lua]=] --[==[

local a = [=[определение некоторой строки [[string]] в языке Lua]=]

Операции, применяемые в Lua

В выражениях, написанных на Lua, могут применяться следующие виды операций:

1. Арифметические операции.

Lua поддерживает следующие арифметические операции:

^ (возведение в степень);

% (остаток от деления).

Арифметические операции применимы как к числам, так и к строкам, которые в этом случае преобразуются в числа.

2. Операции сравнения.

В Lua допустимы следующие операции сравнения величин:

= (больше или равно).

Операции сравнения всегда возвращают логическое значение true или false.

3. Логические операции.

К логическим операциям относятся:

and (логическое И).

Операция and возвращает свой первый операнд, если он имеет значение false или nil. В противном случае, операция возвращает второй операнд (причём этот операнд может быть произвольного типа).

a = (nil and 5) — a равно nil

a == (false and 5) — a равно false

a == (4 and 5) — a равно 5

or (логическое ИЛИ).

Операция or возвращает первый операнд, если он не false и не nil, иначе он возвращает второй операнд.

a == (4 or 5) — a равно 4

a == (false or 5) — a равно 5

Логические операции and и or могут возвращать значения любых типов.

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

a == (4 or f()) — вызова функции f() не произойдет

not (логическое НЕ).

Операция not всегда возвращает true или false.

4. Операция конкатенации.

Для конкатенации (объединения) строк служит операция… (две точки).

Если один или оба операнда являются числами, выполняется их преобразование в строки.

5. Операция получения длины.

Приоритет операций в Lua

В языке Lua выполнение операций осуществляется в соответствии со следующим приоритетом (в порядке убывания):

Вызов скриптов из форм

С каждой формой (включая вложенные формы) связан отдельный скрипт, который обычно содержит функции, выполняющие обработку событий формы и её элементов.

Когда форма запускается, её скрипт загружается в глобальное окружение. При возникновении события формы или её элемента система вызывает сопоставленную этому событию функцию-обработчик.

Необходимо отметить, что скрипт формы, хотя и не содержит вызова функции module, фактически является модулем. Это означает, что переменные, объявленные в скрипте формы без ключевого слова local, не выносятся в глобальное окружение и доступны только внутри этого скрипта. Если необходимо сделать какое-либо значение доступным для скриптов других форм, его следует явным образом определить в глобальной таблице _G:

Другой скрипт форм сможет прочитать это значение следующим образом:

Блоки операторов (инструкций)

К основным операторам Lua относятся:

операторы для организации циклов.

Группа операторов может быть объединена в блок (составной оператор) при помощи конструкции do… end.

do — начало блока

end — конец блока

Блок открывает новую область видимости, в которой можно определять локальные переменные.

a = 5 — глобальная переменная a

local a = 20 — внутри do-end определяется локальная переменная а

MsgBox(a) --> 5 (здесь обращение уже к глобальной a)

Оператор присваивания в Lua

Присваивание изменяет значение переменной или поля таблицы. В простейшем виде присваивание может выглядеть так:

a = 1 — переменной a присвоено значение 1

a = b + c — переменной a присвоена сумма значений переменных b и с

a = f(x) — переменной a присвоено значение, возвращённое функцией f(x)

В Lua допускается так называемое множественное присваивание, когда несколько переменных, находящихся слева от оператора присваивания, получают значения нескольких выражений, записанных справа от оператора присваивания:

a, b = 1, 5*c — a равно 1; b равно 5*c

a, b, c = 1, 2 — a равно 1; b равно 2; c равно nil

a, b = 1, 2, 3 — a равно 1; b равно 2; значение 3 не использовано

Множественное присваивание можно использовать для обмена значениями между переменными:

a = 10; b = 20 — a равно 10, b равно 20

a, b = b, a — теперь a равно 20, b равно 10

Условный оператор (if) в Lua

Оператор if проверяет истинность заданного условия. Если условие является истинным, выполняется часть кода, следующая за ключевым словом then (секция then). В противном случае, выполняется код, следующий за ключевым словом else (секция else).

return a — если a больше b, вернуть a

return b — в противном случае — вернуть b

Секция else является необязательной.

Перед каждой итерацией цикла проверяется условие :

если условие ложно, цикл завершается и управление передаётся первому оператору, следующему за оператором while;

если условие истинно, выполняется тело цикла, после чего все действия повторяются.

while i > 0 do — цикл от 10 до 1

Для выхода из цикла до его завершения можно использовать оператор break.

while i > 0 do — ищем в массиве отрицательное значение

Цикл с постусловием (repeat) в Lua

Оператор repeat предназначен для организации циклов с постусловием и имеет следующий вид:

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

— суммируем значения массива a, пока сумма не превысит 10

Для выхода из цикла до его завершения можно использовать оператор break.

Циклы с оператором for в Lua

Оператор for предназначен для организации циклов и допускает две формы записи:

простую (числовой for);

расширенную (универсальный for).

Простая форма оператора for

Простая форма оператора for имеет следующий вид:

for var = exp1, exp2, exp3 do

Тело цикла выполняется для каждого значения переменной цикла (счётчика) var в интервале от exp1 до exp2, с шагом exp3.

Шаг может не задаваться. В этом случае он принимается равным 1.

for i = 1, 10 do — цикл от 1 до 10 с шагом 1

for i = 10, 1, -1 do — цикл от 10 до 1 с шагом -1

Выражения exp1, exp2 и exp3 вычисляются всего один раз, перед началом цикла. Так, в примере ниже, функция f(x) будет вызвана для вычисления верхнего предела цикла только один раз:

for i = 1, f(x) do — цикл от 1 до значения, возвращенного функцией f()

Переменная цикла является локальной для оператора цикла и по его окончании не определена.

for i = 1, 10 do — цикл от 1 до значения, возвращенного функцией f()

Значение переменной цикла нельзя изменять внутри цикла: последствия такого изменения непредсказуемы.

Читайте также: