我正在加载要多次运行的Lua脚本和另一个Lua脚本,该脚本充当应该由第一个脚本使用的库。
让HelloWorldAPI.lua:
function HelloWorld()
return "Hello world"
end
和SomeScript.lua:
HelloWorld()
我按以下顺序做事:
L = luaL_newstate();
luaL_openlibs( L );
luaL_loadfile( L, "HelloWorldAPI.lua" );
luaL_loadfile( L, "SomeScript.lua" );
...
lua_pcall( L, 0, 0, 0 )
...
lua_pcall( L, 0, 0, 0 )
...
(删除了一些代码以保持简单)
但是我正在调整一个错误,说我在调用HelloWorld函数时试图调用nil值。
为什么?
我执行lib脚本时声明的函数应该是全局的,因此可以在SomeScript.lua中使用,对吗?
谢谢。
答案 0 :(得分:3)
luaL_loadfile();
加载并编译一个块,将其置于堆栈顶部,但尚未执行(因此,在第一次调用luaL_loadfile
后,函数HelloWorld
为< em> not 尚未在全局lua状态中定义。
然后,加载文件SomeScript.lua
,该文件现在位于堆栈顶部。对lua_pcall
的调用现在在顶部执行此块,它尝试调用(尚未)定义的函数HelloWorld
,导致您观察到的错误。
考虑到这一点,这将是正确的顺序:
luaL_loadfile( L, "HelloWorldAPI.lua" );
lua_pcall( L, 0, 0, 0 );
luaL_loadfile( L, "SomeScript.lua" );
lua_pcall( L, 0, 0, 0 );
但是,要加载并立即执行文件,您应该使用luaL_dofile
:
luaL_dofile( L, "HelloWorldAPI.lua" );
luaL_dofile( L, "SomeScript.lua" );
答案 1 :(得分:0)
luaL_loadfile
将编译后的脚本作为函数留在堆栈中。
因此,SomeScript.lua
的函数位于顶部,HelloWorldAPI.lua
的函数位于其下方。