Lua 从参数中获取函数

Sla*_*avi 4 c++ lua

一个简单的生产例子。

protocol.onConnect(function() end, function () end, ...)
Run Code Online (Sandbox Code Playgroud)

现在在 c 中,我想获取 args #1、#2 中的函数。
在字符串,数字,...我们可以使用 (lua_getstring,..) 来获取它们,但我至少没有找到如何获取函数。

int luaProtocolOnConnect(lua_State* L)
{
    int base_func // func #1
    int call_func // func #2
    ....
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*nko 5

您可以使用lua_isfunction来检查它是否是一个函数,用于lua_pushvalue将其值压入堆栈顶部,然后使用luaL_ref ( luaL_ref(L,LUA_REGISTRYINDEX);) 将其转换为一个唯一的键,您可以稍后引用以检索值 ( lua_rawgeti(L,LUA_REGISTRYINDEX,ref)) 并调用该函数。


Nic*_*las 5

你不能真正“得到”一个 Lua 函数。Lua 函数,就像 Lua 表一样,是纯 Lua 对象。因此,它们没有 C 或 C++ 模拟。如果你想调用一个Lua函数,这样做了通过lua_calllua_pcall或类似的功能。这是在 Lua 堆栈上原位完成的。

所以你不能把一个 Lua 函数变成一个 C++ 值。您可以做的是获取一个 Lua 函数并以各种方式操作它,以便所有 Lua 对象都可以被操作。

例如,假设您想在 C++ 对象中存储一个 Lua 函数,然后调用存储在那里的任何 Lua 函数。显然,您不能将 Lua 函数直接转换为 C++ 值。您可以做的是将该 Lua 函数存储在 C++ 可以访问的地方。您使用一些确实具有 C++ 模拟的值来引用存储的 Lua 函数。对于要像这样存储的每个对象,该值必须是唯一的。您在存储对象时获得的值将保存在您的 C++ 对象中。当需要检索 Lua 函数时,您只需使用存储的值来检索它。

因为这是一个非常常见的操作,Lua 有办法来促进这一点。第一个是 Lua 注册表,这是一个 C++ 可以访问但 Lua 代码不能访问的表(除非您授予它访问权限)。

二是luaL_ref系列功能。luaL_ref获取堆栈顶部的任何内容并将其粘贴在您提供的表格中,返回给您一个整数键,可用于稍后检索它。lua_rawgeti可用于通过键从表中检索函数,并luaL_unref获取表和整数键,完成后从表中删除引用的函数。

所以如果你想存储这样的函数,你只需要创建一个这样的表,把它贴在注册表中的一个已知位置(这样你就可以在需要的时候获取它),然后luaL_ref用来存储这些函数。当需要调用它们时,使用 检索它们lua_rawgeti。当你用完它们时,用 销毁它们luaL_unref