Lua metamethod __newindex:"当桌子不是桌子时会发生这个事件"?

时间:2016-10-08 18:58:22

标签: lua

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进行测试。

1 个答案:

答案 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,因为该方法仅适用于表格。