【问题标题】:Calling Lua function调用 Lua 函数
【发布时间】:2011-06-22 23:18:12
【问题描述】:

我想在 Lua 和 C 中处理以下代码:

假设我有一个绑定到 Lua 的名为 Foo 的 C 函数。我在 Lua 脚本中这样称呼它:

Foo(15, "bar", function(z) return 2 * z + 1 end)

在 C 端,我检索参数并且可以将数字和字符串存储在我的结构中。但是我需要什么数据类型来存储匿名函数?以后怎么调用呢?

【问题讨论】:

    标签: c api lua


    【解决方案1】:

    你不能将 Lua 函数存储为 C 数据类型,就像你不能将 Lua 表存储为 C 数据类型一样。

    你可以做的是使用the registry 来存储这个值。注册表是所有 C 用户用于存储数据的全局可用表。为所有代码选择一个键并在该键处放置一个表通常是个好主意。此表将包含您要保留的值。这将有助于减少使用注册表的其他 C 代码的冲突。

    【讨论】:

      【解决方案2】:

      您可以将函数留在堆栈中的某个位置,也可以将其保存在注册表或其他带有 luaL_ref 的表中。

      【讨论】:

        【解决方案3】:

        通常,您不会将函数存储在 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 以获得有关功能的更多详细信息。

        【讨论】:

          【解决方案4】:

          这个页面也可能有帮助:http://www.lua.org/pil/25.2.html

          还有这个:http://www.luafaq.org/#T7.2

          似乎在这里得到了回答: how to callback a lua function from a c function

          【讨论】:

            【解决方案5】:

            一种方法是做匿名函数的工作 在 lua 端 并将函数的结果传递给 FOO(int, char*, fun_result_type fun_result)

            【讨论】:

              猜你喜欢
              • 2015-03-08
              • 2021-04-15
              • 2011-03-26
              • 2012-06-30
              • 2014-09-01
              • 2012-06-06
              • 2015-07-14
              • 2013-02-19
              相关资源
              最近更新 更多