Lua问题 - 运行之前加载库文件

我正在加载一个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函数时,我得到一个错误,说我正在尝试调用一个空值。

为什么?

执行lib脚本时声明的函数应该是全局的,因此应该在SomeScript.lua中可用,对吧?

谢谢。

点赞
用户5636775
用户5636775

luaL_loadfile(); 加载并编译一个代码块,将其放在堆栈顶部,但不立即执行它(因此,在第一次调用 luaL_loadfile 后,在全局 lua 状态中还未定义 HelloWorld 函数)。

然后,加载文件 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" );
2016-03-01 15:46:42
用户107090
用户107090

luaL_loadfile 将编译后的脚本作为一个函数留在栈上。

因此,SomeScript.lua 的函数在顶部,而HelloWorldAPI.lua 的函数在其下方。

2016-03-01 15:46:53