【问题标题】:Lua: How to reference a lua method inside a lua class from C for later use?Lua:如何从 C 中引用 lua 类中的 lua 方法以供以后使用?
【发布时间】:2010-12-22 16:27:58
【问题描述】:

我得到了一个 lua 方法的引用,该方法位于一个具有 luaL_ref 函数的类中。当我想调用该方法时,我使用函数 lua_rawgeti 将函数推送到堆栈中,然后我使用 lua_pcall 实际调用该方法。除了我无法从该方法访问其他类成员之外,一切工作正常,因为 self 为零。

有谁知道我该如何解决这个问题?

谢谢!

【问题讨论】:

    标签: lua


    【解决方案1】:

    Lua“方法”实际上是函数。他们没有 self 的概念,就像其他语言一样。正如 gwell 所说,obj:method(...) 实际上是 obj.method(obj, ...) 的语法糖。

    如果您需要使用对象,请不要保存对对象函数的引用 - 保存对对象本身的引用。您可以使用以下代码使用 Lua C API 调用方法:

    /* get the object, idx is the identifier returned by luaL_ref */
    lua_rawgeti(L, LUA_REGISTRYINDEX, idx);
    lua_getfield(L, -1, "method");
    /* push parameters - the object first, then the rest, then call the function */
    lua_pushvalue(L, -2);
    ...
    lua_call(L, nParams + 1, 1);
    

    【讨论】:

    • 然而,当定义一个函数为function obj:foo() print(self.property) end时,self参数隐含的。
    • 嗯,是的,如果你定义你的函数为function Class:method(a,b),那么它实际上有三个参数——selfab。您可以使用function Class.method(this, a, b) 语法将第一个参数命名为任何您想要的名称。但这并没有改变解决方案的任何内容 - 引用对象而不是方法(但您需要知道方法名称)。然后调用协议将对象作为第一个参数传递给方法,然后是其余的。
    【解决方案2】:

    Lua 冒号运算符使用语法糖将被引用的表放置为函数调用中的第一个参数(又名self)。您应该能够将表(对象)作为函数调用的第一个参数,它应该可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 2013-05-28
      • 2021-03-11
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多