4

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

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

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

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

我现有的代码可以在这里找到

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

4

1 回答 1

2

没有__getn元方法。试试__len吧。这仅适用于Lua 5.2

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

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

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

print(#t) --> 5

但是请注意,该newproxy功能是未记录的。

于 2014-06-07T12:27:53.413 回答