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