我在Lua堆栈上有一个表。如何在返回此表的堆栈上推送函数?

时间:2015-04-29 16:23:14

标签: lua

使用C API,我在 Lua 堆栈上推了一个表。如何在返回该表的堆栈上推送一个函数?

我能找到的最近的是lua_pushcclosure,但是它会在堆栈上推送lua_CFunction,而不是真正的 Lua 函数,这在我的情况下是不可接受的,因为我想稍后使用setfenv,这只适用于真正的 Lua 函数。

此致

2 个答案:

答案 0 :(得分:0)

嗯,你做的很明显。因为它必须是一个真正的Lua函数",你必须创建一个返回表格的真实Lua函数。

这样的事情:

local tbl = ...
return function() return tbl end

这是一个Lua块,在执行时,将返回一个函数,该函数返回调用原始块的第一个参数。

所以只需使用luaL_loadstring加载该字符串即可。用你的桌子调出生成的夹头;返回值将是您想要的功能。

话虽如此,你的问题最终没有意义。 setfenv在这里不会有任何有价值的东西。设置返回本地表的函数的环境不会影响表中存储的任何内容。

答案 1 :(得分:0)

老问题,但我现在按照Etan的建议添加正确答案。

status = luaL_dostring(L, "return function (ppp) return function () return ppp end end");
if (!status) {
    // push table here
    status = lua_pcall(L, 1, LUA_MULTRET, 0);
}

关于没有意义的问题,我知道setfenv没有效果。

我唯一的要求是可以执行setfenv而不会导致崩溃。