【问题标题】:How to implement (anonymous) Lua callback functions for any number of Lua objects (tables)?如何为任意数量的 Lua 对象(表)实现(匿名)Lua 回调函数?
【发布时间】:2012-03-13 19:29:19
【问题描述】:

我在 Lua 中有“对象”,它们使用表来维护它们的数据和函数集。简单例子:

obj = {func = function(self) print(self) end}

可能有任意数量的对象。

现在我有一个 C 函数 registerObject(obj),它应该以某种方式保留对该 Lua 对象(obj 表)的引用,以便以后能够调用该特定对象的 func 函数(和其他函数)。这意味着我没有对象表的名称,我需要保留对表本身的引用。

我怎样才能做到这一点? C++例子也可以,其实C函数只是一个接口,为每个obj创建一个Objective-C类。

【问题讨论】:

标签: objective-c c function callback lua


【解决方案1】:

Lua 表是通过引用传递的,所以它们实际上总是“匿名的”,对它们的引用存储在一个变量中。我只是把你所有的“对象”放在一张桌子上 像这样:

objects={}
function registerObject(obj)
    objects[#objects+1]=obj
end
a={func=function(self) return(self.data) end, data='foo'}
b={func=function(self) return(self.data) end, data='bar'}
registerObject(a)
registerObject(b)
for k,v in pairs(objects) do
    print("Object",k,"data:",v:func())
end

您需要记住的一件事是,这会禁止收集这些表,因为对象表中始终存在对对象的引用,除非您明确删除它。这可能是也可能不是您想要的。如果您不希望对象表干扰垃圾收集,您可以将元表中的 __mode 条目设置为 'v' 以表示弱值。这样,对对象表中对象的引用就不会被计算在内;如果 objects 表中的值是对该对象的唯一剩余引用,则将收集该对象(有关详细信息,请参阅Programming in Lua)。

【讨论】:

  • 谢谢,但我在 Lua 端有一个对象表,它将这些对象存储在层次结构中。 registerObject 是一个 C 函数,需要存储每个单独的对象。看来我可以通过使用 luaL_ref 来实现这一点。
  • 注意:使用 luaL_ref 和协程时要非常小心;如果您存储 lua_State 以便随时获取该值,则可能是一个随时可能死亡的协程。解决方案是将主 lua_State 作为“MAIN_STATE”推送到注册表,然后获取对它的引用。
【解决方案2】:

The registry。我无话可说

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2014-12-03
    • 1970-01-01
    • 2013-07-14
    • 2023-03-24
    • 2020-11-22
    • 1970-01-01
    • 2013-03-29
    • 2017-05-21
    相关资源
    最近更新 更多