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