修改Lua中的#运算符。

我已经在love2d引擎上建立了一个Lua控制台,但这与本问题无关。我正在尝试升级元表以便能够影响更多元素(pairs函数、更改另一个表的元表,而不仅仅是目标表等),我正在制作的附加组件之一是“__changeindex”事件,用于修改现有索引。

为了做到这一点,我必须给用户一个虚拟表,它不包含任何值,当他们试图添加某些东西时,检查是否已经在真实表中定义了这个东西,如果是,则调用“__changeindex”,如果不是,则调用“__newindex”。这个方案完美地工作,但这会导致许多其他Lua表函数停止工作(例如for循环/getmetatable/setmetatable)。我已经为大多数这些问题制定了解决方案,它们运行良好,但是我无法使#t操作符运行,我希望能够说:

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

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

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

编辑:这是我的第一篇文章,如果我没有完全遵循发布规则,请见谅 :) 如果有人有办法使虚拟和真实表垃圾收集,我会非常感谢。

点赞
用户3080396
用户3080396

Lua 5.2 中没有 __getn 的元方法。请尝试使用 __len 替代。

Lua 5.1 中,你无法重载表格中的 # 运算符。

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

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

print(#t) --> 5

需要注意的是,newproxy 函数是未记录的

2014-06-07 12:27:53