0

我还是一个元表的新手,有些东西让我感到困惑

当我在我的元表中使用__index和之类__newindex的元方法时,它们仅在我调用表的元素时被调用,如下所示:

print(table[index]) -- this call the __index

table[index] = value -- this call the __newindex

但是当我如下调用表的元素时,不会调用这两个元方法:

print(table.index) -- this does NOT call __index

table.index = value -- this does NOT call __newindex

我的问题是,有什么方法可以table.index同时调用这两个元方法?还是只table[index]工作?

4

2 回答 2

2

是的, __index 将与两个括号一起使用:mytable["index"]以及点运算符:mytable.index

mytable = setmetatable({}, { __index = function(t, k)
  if k == "index" then
    return "works fine"
  end
  return rawget(t, k)
end })

print(mytable["index"])
print(mytable.index)

您可以使用 rawget 和 rawset 规避预设的元表方法

话虽如此,如果您是 Lua 新手,我建议您寻找无需元表的简单解决方案。

于 2020-08-25T08:04:09.490 回答
1

__idnex__newindex方法仅在表在相关索引处没有元素时使用。如果已经有一个元素,索引将只返回该元素,设置它只会覆盖现有元素。

如果您想完全控制表中的所有索引,则必须将其保持 100% 为空并将其所有值保存在另一个表中并使用元方法访问这些值。

于 2020-08-25T06:08:53.370 回答