Lua C api: Как загрузить файлы lua, определенные как модули? - PullRequest
3 голосов
/ 23 июня 2010

У меня есть следующий скрипт lua:

module("modoo",package.seeall)
foo=1
bar={12,34}

, который отлично работает, используя cli, например:

> dofile "mod_modoo.lua"
> =modoo.foo
1
> =modoo
table: 0x86ce058

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

Я думал, что использование lua_getglobal не будет работать с модулями, но я также не смог найти правильный способ его загрузки; как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 23 июня 2010

Загрузка модулей Lua с require, как lua.c делает.Смотри http://www.lua.org/source/5.1/lua.c.html#dolibrary

3 голосов
/ 23 июня 2010

Вместо использования module и dofile в Lua 5.1 лучше просто возвращать таблицу, представляющую ваш модуль, при запуске скрипта. Все функции и переменные должны быть объявлены как local в скрипте модуля, чтобы возвращаемая таблица предоставляла единственную точку доступа, и никакие глобальные переменные из других модулей не вытеснялись. Модуль должен быть импортирован с использованием require следующим образом.

mod_modoo.lua:

return { foo = 1,  bar = { 12, 34 } }

modoo_test.lua:

> local modoo = require "mod_modoo"

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

mod_modoo.lua:

modoo = { foo = 1,  bar = { 12, 34 } }
return modoo

modoo_test.lua:

> require "mod_modoo"
> print(modoo.foo)
1

См. Статью Lua Module Critiqued для получения дополнительной информации по этому вопросу.

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