如何让 __index 和 __newindex 检测到 table.index

how to make then __index and __newindex detect table.index

我对 metatables 还是个小新手,有些事情让我很困惑

当我在我的 metatable 中使用 __index__newindex 等元方法时,它们仅在我调用 table 的元素时被调用,如下所示:

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

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

但是当我调用 table 的一个元素时,这两个元方法没有被调用,如下所示:

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

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

我的问题是,有没有办法让 table.index 也调用这两个元方法?还是只有 table[index] 有效?

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

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

是的,__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 的新手,我建议您寻找无需元表即可工作的简单解决方案。