Lua:在加载文件后,获取全局函数失败。

我正在尝试调用名为test2.lua的lua文件中的函数。

这是test2.lua的内容:

function abc(path)
 t = {}
 table.insert(t, "a")
 return t
end

可以看到它接受单个输入并返回一个字符串。

这是我的C代码。它非常简单。然而,我的调用getglobal以调用该函数失败了...当我测试时,lua_getglobal说它不是一个函数...这是为什么? abc不应该是可在源文件内返回的全局函数吗?为什么它仅找到该全局的nil?

L = lua_open();
luaL_openlibs(L);
luaL_loadfile(L, "src/test2.lua");

lua_getglobal(L, "abc");

lua_pushstring(L, "coollll");

int error = 0;
if ((error = lua_pcall(L, 1, 1, 0)) == 0)
{
    std::cout << "cool";
}

编辑:

无论是使用loadfile还是dofile,调用lua_getglobal都会使我的程序失去控制...有什么想法吗?

lua_getglobal crashing program

原文链接 https://stackoverflow.com/questions/6741050

点赞
stackoverflow用户726300
stackoverflow用户726300

不能仅仅调用luaL_loadfile:这只是将代码块压入栈中。要么跟进执行该块的luaL_[p]call(从而使该函数可用),要么使用luaL_dofile

2011-07-19 00:45:59
stackoverflow用户68204
stackoverflow用户68204

函数 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 是一个全局变量。你可能想在 abc() 头部写下 local t = {}

2011-07-19 00:50:17