Skip to content

Системный объект как интерфейс

После прочтения прошлой главы мог возникнуть резонный вопрос. Если все переменные и объекты модуля уничтожаются -- то как вообще взаимодействовать с модулем? Если модуль должен предоставлять какой-либо интерфейс, а также сохранять своё состояние, то в модуле следует создать системный объект (чьё имя начинается с символа '@'). Подробнее про системные объекты можно прочитать в документации 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 -- интерфейс к модулю

Итак, подводя итоги:

  • интерфейсом к модулю служит системный объект, имя которого совпадает с именем модуля;
  • все переменные, которые нужно сохранять, должны быть переменными этого объекта;
  • вы можете вызывать методы через модуль.метод().