Перейти к содержанию

Введение в Luanium

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

Основные изменения

В Luanium нету большинства библиотек по типу os, env и ключевого слова require, вместо них используются другие библиотеки и функции.

Основные понятия

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

Пространство имён (namespace)

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

Допустим, что мы пишем калькулятор:

sum.lua

1
2
3
function sum(x, y)
    return x + y
end

div.lua

1
2
3
4
5
6
function divide(a, b)
    if b == 0 then
        error("division by zero")
    end
    return a / b
end

calc.lua

1
2
3
4
5
6
7
function calc(fnum, snum, operator)
    if operator == "/" then
        return divide(fnum, snum)
    else if operator == "+" then
        return sum(fnum, snum)
    end
end

calc.lua Не сможет вызвать divide() и sum(), т.к. в файле calc.lua они просто не объявлены. Вместо того, чтобы копировать содержимое div.lua и sum.lua мы можем использовать пространства имён:

Namespace() - Эта функция добавляет текущий файл скрипта в указанное пространство имён.

sum.lua

1
2
3
4
Namespace("calculator") -- Добавляем этот файл в пространство имён "calculator"
function sum(x, y)
    return x + y
end

div.lua

1
2
3
4
5
6
7
Namespace("calculator") -- То же пространство имён
function divide(a, b)
    if b == 0 then
        error("Ошибка: деление на ноль!")
    end
    return a / b
end

Теперь наши скрипты реализующие работу с расчётами добавлены в пространство имён. Чтобы использовать это пространство имён нужно обновить calc.lua добавив вызов функции Include():

calc.lua

1
2
3
4
5
6
7
8
9
Include("calculator") -- импортируем все файлы из пространства имён "calculator"

function calc(fnum, snum, operator)
    if operator == "/" then
        return divide(fnum, snum)
    else if operator == "+" then
        return sum(fnum, snum)
    end
end

Индексация дисков

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

Функция Include()

Импортирование файлов

Функция Include() может импортировать напрямую луа файлы:

1
Include("0:/some-lua-file.lua")
Здесь перед двоеточием указывается индекс диска, с которого мы читаем файл, а после двоеточия указывается полный путь к lua файлу.

Контекст выполнения

Все скрипты, написаные на lua выполняются в "контекстах выполнения" (я не смог придумать название получше). Сейчас я объясню, что это для вас значит:

Каждый вызов функции Include() импортирует что либо не в файл, а в "контекст выполнения", т.е. если вы импортировали что-то в одном файле, то это автоматически импортируется в остальных файлах этого контекста:

first.lua

1
2
Include("calculator")
Include("0:/second.lua")

second.lua

1
result = sum(2, 2) -- функуия sum доступна, т.к. Include из first.lua выполняет second.lua в том же контексте.

Seealso

Контексты выполнения так же содержат различные переменные, которые можно получать в скриптах Luanium. Подробнее об этом можно узнать в Контекст выполнения

Описание работы функции Include() за кулисами

Когда вы импортируете что либо, импортируемые файлы на самом деле исполняются:

first.lua

1
result = 2 + 2

second.lua

1
2
Include("0:/first.lua")
result = result + 2 -- Будет 6, т.к. Include выполнил код в first.lua