【问题标题】:Lua C API - mapping a property to a functionLua C API - 将属性映射到函数
【发布时间】:2013-10-18 19:56:51
【问题描述】:

是否可以将函数作为属性推送到 Lua 中?

现在,我可以将 Get/Set 函数作为字段推送,如下所示:

lua_pushcfunction(L,L_Getter);
lua_setfield(L, -2, "GetValue");    

lua_pushcfunction(L,L_Setter);
lua_setfield(L, -2, "SetValue");    

然后像这样在 Lua 中调用它们:

MyObject:SetValue("NewValue")

是否可以推送映射到没有元表的 C 函数的属性?我可以将元表中的__index__newindex 映射到自定义函数,但我想知道是否有更简单的方法。最终,我想要以下没有元表的语法:

MyObject.CValue = 1
print(MyObject.CValue)

如果没有__index__newindex,这可能吗?

【问题讨论】:

  • 你试过了吗?它应该可以工作。如果MyObject 是一个表格。
  • @lhf 是的,它只返回 function: 00XXXXXX,这是有道理的,因为该字段已映射到函数。
  • @lhf 这是一个带有元表的表,将__index 指向用户数据的各个字段。

标签: c lua metatable lua-api


【解决方案1】:

没有元表?不,元方法是调用函数来评估tbl.foo 的唯一方法。您可以将MyObject 设为用户数据,但同样您需要一个元表来提供__index 元方法。

学会喜欢元表。它们是 C/Lua 集成的支柱。

【讨论】:

  • 我已经有了带有元表的代码的工作版本,但我只是想知道我是否缺少一些基本的东西。显然不是,谢谢!
  • 请注意:在 Lua 中实现 __index/__newindex 元方法并让它们调用相应的 C getter/setter 比在 C 中自己创建元方法更容易。如果你实现__index/__newindex 在 C 中,获取对您期望的所有字符串的引用,这样您就可以通过对象标识而不是字符串比较来匹配。
  • 很有趣,您将如何获取参考资料?我在哪里可以获得有关对象身份的更多信息?
  • 推送字符串,使用luaL_ref进行引用,使用luaL_getref访问。或者(实际上,这更简洁)将它们设置为 C 函数的上值(有关如何执行此操作的更多详细信息,请参阅 lua_pushcclosure 上的手册)并使用 lua_upvalueindex 从您的函数中找到它们。无论哪种情况,只需使用lua_compare 来查看它是否匹配。另一种方法是使用一个表来匹配 getter/setter 函数的字段;如果你有很多,这可能会更快。
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多