Lua 5.3参考手册(在此part中,向下滚动)说:
__ newindex:索引分配表[key] = value。与索引事件一样,当table不是表或表中没有键时,会发生此事件。这个元方法在表格中查找。
但是我不明白,当table不是表时,metamethod __newindex会发生。那是什么意思?我确实尝试使用nil
重新分配本地,但它没有工作(是的,我知道重新分配表格没有意义,但这有助于它垃圾收集)。
local v = {};
setmetatable(v, {
__newindex = function(t,k,v)
print("Aaahhh...!");
end
});
v = nil;
我正在使用此online compiler进行测试。
答案 0 :(得分:5)
从您引用的页面:
您可以使用setmetatable替换表的元表 功能。您无法从Lua代码更改其他类型的元表 (除了使用调试库(第6.10节));你应该使用C API 为此。
您不能使用setmetatable
来更改不是表格的元素,因此您将无法验证您的期望(当您索引时调用__newindex
方法进入不是桌子的东西。)
您的代码运行是因为 为表设置了元表。 (local v = {}
创建一个表。)
但是将变量v
重新分配为其他东西意味着您无法再找到您创建的表。如果你的最后一行是v[5] = 'Hello'
,那么你会看到你的metamethod被调用。
修改强>
阅读您的编辑,看起来您希望在表被垃圾收集时调用__newindex
?我认为你误解了当表不是表时__newindex
被称为“{1}}的说法。”这意味着如果你做了这样的事情:
local v = 5
print(v[3]) -- indexing into something that's not a table
将调用 __newindex
(因为在表达式table[key]
中,此处为v[3]
,table
不是表格。但是您无法通过__newindex
方法实际设置setmetatable
,因为该方法仅适用于表格。