【发布时间】:2011-06-22 23:18:12
【问题描述】:
我想在 Lua 和 C 中处理以下代码:
假设我有一个绑定到 Lua 的名为 Foo 的 C 函数。我在 Lua 脚本中这样称呼它:
Foo(15, "bar", function(z) return 2 * z + 1 end)
在 C 端,我检索参数并且可以将数字和字符串存储在我的结构中。但是我需要什么数据类型来存储匿名函数?以后怎么调用呢?
【问题讨论】:
我想在 Lua 和 C 中处理以下代码:
假设我有一个绑定到 Lua 的名为 Foo 的 C 函数。我在 Lua 脚本中这样称呼它:
Foo(15, "bar", function(z) return 2 * z + 1 end)
在 C 端,我检索参数并且可以将数字和字符串存储在我的结构中。但是我需要什么数据类型来存储匿名函数?以后怎么调用呢?
【问题讨论】:
你不能将 Lua 函数存储为 C 数据类型,就像你不能将 Lua 表存储为 C 数据类型一样。
你可以做的是使用the registry 来存储这个值。注册表是所有 C 用户用于存储数据的全局可用表。为所有代码选择一个键并在该键处放置一个表通常是个好主意。此表将包含您要保留的值。这将有助于减少使用注册表的其他 C 代码的冲突。
【讨论】:
您可以将函数留在堆栈中的某个位置,也可以将其保存在注册表或其他带有 luaL_ref 的表中。
【讨论】:
通常,您不会将函数存储在 C 变量中。您将它留在堆栈上并使用 pcall() 调用它。比如:
int l_Foo(lua_State *L)
{
lua_pop(L, 2); /* ignore the first two args */
/* (the function is now on top of the stack) */
lua_pushnumber(L, 2); /* push the number to pass as z */
lua_pcall(L, 1, 1, 0); /* call the function with 1 argument, expect 1 result */
lua_pop(L, 1); /* ignore the result */
}
为简洁起见,我省略了一些错误检查,但请参阅 Programming in Lua 以获得更完整的示例,并参阅 the Lua Reference Manual 以获得有关功能的更多详细信息。
【讨论】:
这个页面也可能有帮助:http://www.lua.org/pil/25.2.html
还有这个:http://www.luafaq.org/#T7.2
似乎在这里得到了回答: how to callback a lua function from a c function
【讨论】:
一种方法是做匿名函数的工作
在 lua 端 并将函数的结果传递给
FOO(int, char*, fun_result_type fun_result)
【讨论】: