Функция luaL_loadfile()
читает, анализирует и компилирует именованный файл Lua.Он не выполняет никакого своего содержимого.Это важно в вашем случае, потому что оператор function abc(path)
... end
не имеет видимого эффекта, пока не будет выполнен.Ключевое слово function
, как вы его использовали, эквивалентно написанию
abc = function(path)
t = {}
table.insert(t, "a")
return t
end
В этой форме становится понятнее, что переменной с именем abc
фактически не присваивается значение до тех пор, пока код не будет выполнен.
Когда возвращается luaL_loadfile()
, он помещает анонимную функцию в верхнюю часть стека Lua, которая является результатом компиляции вашего файла.Вам нужно позвонить, и lua_pcall()
сделает свое дело.Замените вашу ссылку на luaL_loadfile()
следующим:
if (luaL_loadfile(L, "src/test2.lua") || lua_pcall(L, 0, LUA_MULTRET, 0)) {
// do something with the error
}
На этом этапе test2.lua был выполнен и доступны все функции, которые он определил, или другие глобальные переменные, которые он изменил.
ЭтоЭто достаточно распространенная идиома, что функция luaL_dofile()
предназначена для загрузки и вызова файла по имени.
В представленном вами коде есть вторая, более тонкая проблема.Функция abc()
использует переменную с именем t
, но вы должны знать, что t
- это глобальная переменная.Вы, вероятно, хотели написать local t = {}
в верхней части abc()
.