修改lua中的#运算符

修改lua中的#运算符,lua,operator-overloading,lua-table,metatable,meta-method,Lua,Operator Overloading,Lua Table,Metatable,Meta Method,我在love2d引擎上制作了一个lua控制台,这是不相关的。我正在尝试升级元表以实现更多功能(pairs函数、更改另一个表上的元表而不是目标表等),我正在制作的一个插件是修改现有索引时的\u changeindex事件 为了做到这一点,我必须为用户提供一个不包含任何值的虚拟表,当用户尝试添加某个值时,请检查该值是否已在实际表中定义,如果已定义,则调用\uu changeindex,如果未定义,则调用\uu newindex。这可以很好地工作,但是这会导致许多其他Lua表函数停止工作(对于循环/g

我在love2d引擎上制作了一个lua控制台,这是不相关的。我正在尝试升级元表以实现更多功能(pairs函数、更改另一个表上的元表而不是目标表等),我正在制作的一个插件是修改现有索引时的
\u changeindex
事件

为了做到这一点,我必须为用户提供一个不包含任何值的虚拟表,当用户尝试添加某个值时,请检查该值是否已在实际表中定义,如果已定义,则调用
\uu changeindex
,如果未定义,则调用
\uu newindex
。这可以很好地工作,但是这会导致许多其他Lua表函数停止工作(对于循环/getmetatable/setmetatable)。我已经为这些问题中的大多数做了变通,它们工作得很好,但我想说的是,我无法让t操作符工作

t1={1,2,3}
t2=setmetatable({},{__getn=function(self) return #t1 end})
然后#t2应该真的返回#t1。我有什么办法可以这样做吗

可以找到我的现有代码


编辑:这是我的第一篇帖子,所以如果我没有完全遵守发布规则,我表示歉意,我尝试过:)如果有人有办法让假表和真表进行垃圾收集,我将非常感激。

没有
\u getn
元方法。请尝试使用
\uu len
。这只适用于

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

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

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

print(#t) --> 5

但是请注意,
newproxy
函数是。

没有
\uu getn
元方法。请尝试使用
\uu len
。这只适用于Lua5.2love2d,但不幸地使用了Lua5.1。我正在尝试创建_getn功能。如果您查看我发布的代码,我已经为uu next、u getn(仅table.getn版本)、u maxn、u changeindex、u setmetatable添加了功能,并且将添加更多。您不能在Lua5.1中为table重载
运算符。您可以使用userdata创建代理对象
t=newproxy(true)getmetatable(t)。\uu len=function()返回5个结束打印(#t)
我没有听说过newproxy函数,但它看起来很吸引人。谢谢你的邀请assistance@moteus,您可以将您的评论移至答案。