【发布时间】:2017-08-21 12:50:17
【问题描述】:
我注册了一个 Lua 函数,它需要一个元表作为参数,我想在 C++ 运行时修改表的内容:
int operate(lua_State *L)
{
std::vector<int> values{};
if (auto length = get_length_at_index(L, 1))
{
result.reserve(length);
lua_pushnil(L);
while (lua_next(L, 1))
{
result.push_back(lua_tointeger(L, -1));
lua_pop(L, 1);
}
}
for (auto &v : values)
{
v *= 2;
}
return 0;
}
int main()
{
auto L = luaL_newstate();
luaL_dofile(L, "script.lua");
lua_register(L, "operate", operate);
return 0;
}
上面的代码是"lua.script",看起来像这样:
values = {1, 2, 3, 4, 5, 6}
operate(values)
for index = 1, #values do
print(values[index])
end
预期输出是从 1 到 6 的值乘以 2,但输出是未修改的值。很明显,这是因为我将元表复制到std::vector 并修改副本。
有没有办法从 C++ 运行时对 Lua 对象进行操作,以反映从 C++ 应用的更改?
PS:我知道我可以将表作为函数返回值返回,但我想知道是否还有其他选择。
【问题讨论】:
-
在任何情况下,在加载使用它的脚本之前,您都必须在解释器中注册该函数。同样没有
luaL_openlibs(L),您将无法使用print。