【问题标题】:modify # operator in lua修改lua中的#操作符
【发布时间】:2014-03-09 01:11:53
【问题描述】:

我在love2d引擎上做了一个lua控制台,这无关紧要。我正在尝试升级元表以实现更多功能(配对功能,在另一个表上更改元表而不是目标表等),我正在制作的插件之一是 __changeindex 事件,当你修改现有索引。

为了做到这一点,我必须给用户一个不包含任何值的虚拟表,当他们尝试添加一些东西时,检查它是否已经在真实表中定义,如果是,则调用 __changeindex,如果它不是然后调用__newindex。这可以完美运行,但是这会导致许多其他 Lua 表函数停止工作(对于循环/getmetatable/setmetatable)。我已经为大多数这些问题制定了解决方法,它们工作正常,但我无法让#t 运算符工作,我想说

t1={1,2,3}
t2=setmetatable({},{__getn=function(self) return #t1 end})

然后#t2 应该真正返回#t1。我有什么办法可以做到这一点?

我现有的代码可以在here找到

编辑:这是我的第一篇文章,所以如果我没有完全遵守发布规则,我深表歉意,我试过了 :) 如果有人有办法让假表和真表垃圾收集,我将不胜感激

【问题讨论】:

  • 没有__getn 元方法。请改用__len。这仅适用于 Lua 5.2
  • love2d 不幸地使用了 lua 5.1。我正在尝试创建 __getn 功能。如果您查看我发布的代码,我已经添加了 __next、__getn(仅 table.getn 版本)、__maxn、__changeindex、__setmetatable 的功能,并且将添加更多功能
  • Lua 5.1 中的表不能重载# 运算符。您可以使用 userdata 来创建代理对象。 t = newproxy(true) getmetatable(t).__len = function() return 5 end print(#t)
  • 我没有听说过 newproxy 功能,但它看起来很吸引人。感谢您的帮助
  • @moteus,您可以将评论移至答案。

标签: lua operator-overloading lua-table metatable meta-method


【解决方案1】:

没有__getn 元方法。请改用__len。这仅适用于Lua 5.2

您不能为Lua 5.1 中的表重载# 运算符

您可以使用 userdata 来创建代理对象:

t = newproxy(true)
getmetatable(t).__len = function()
    return 5
end

print(#t) --> 5

但请注意,newproxy 函数是 undocumented

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多