如何让 __index 和 __newindex 检测 table.index

我对元表还是一个新手,有一件事让我有些困惑

当我在元表中使用像 __index__newindex 这样的元方法时,它们只在我按以下方式调用表中的元素时才被调用:

print(table[index]) -- 这会调用 __index

table[index] = value -- 这会调用 __newindex

但是当我按以下方式调用表中的元素时,这两个元方法不会被调用:

print(table.index) -- 这不会调用 __index

table.index = value -- 这不会调用 __newindex

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

点赞
用户4984564
用户4984564

__index__newindex 元方法只有在表中没有该索引的元素时才会被使用。如果已经存在元素,则索引将返回该元素,并将其设置只会覆盖现有元素。

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

2020-08-25 06:08:53
用户13619683
用户13619683

是的,__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"]) -- 输出 "works fine"
print(mytable.index) -- 输出 "works fine"

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

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

2020-08-25 08:04:09