Системный объект как интерфейс
После прочтения прошлой главы мог возникнуть резонный вопрос. Если все переменные и объекты модуля уничтожаются -- то как вообще взаимодействовать с модулем? Если модуль должен предоставлять какой-либо интерфейс, а также сохранять своё состояние, то в модуле следует создать системный объект (чьё имя начинается с символа '@'). Подробнее про системные объекты можно прочитать в документации STEAD3. Важно то, что такие объекты не уничтожаются в процессе смерти мира, и таким образом играют роль интерфейса к модулю. Например:
lua
-- модуль testmod.lua
obj {
nam = '@testmod';
hello = function(s)
dprint("Hello world");
end;
}Такой модуль уже можно использовать:
lua
loadmod 'testmod'
_'@testmod'.hello() -- получили объект '@testmod' и вызвали метод hello()Но это не слишком удобно. Следующий вариант модуля:
lua
-- модуль mymodule.lua
local mod = obj { -- локальная ссылка на объект
nam = '@testmod';
}
function mod.hello(a) -- вариант определения метода вне объекта
dprint("Hello world")
end
testmod = mod -- глобальный объект testmod -- интерфейс к модулюИспользование модуля:
lua
loadmod 'testmod'
testmod.hello()Сделаем вариант модуля с переменной, которая должна сохранятся:
lua
-- модуль mymodule.lua
local mod = obj { -- локальная ссылка на объект
nam = '@testmod';
num = 0; -- переменная
}
function mod.hello(a)
dprint("Hello world", mod.num)
mod.num = mod.num + 1
end
testmod = mod -- глобальный объект testmod -- интерфейс к модулюИтак, подводя итоги:
- интерфейсом к модулю служит системный объект, имя которого совпадает с именем модуля;
- все переменные, которые нужно сохранять, должны быть переменными этого объекта;
- вы можете вызывать методы через модуль.метод().