__index = function(tbl, key)
local a = tbl[key]
if a <=0 then a = 0 end
if a > 5 then a = 0 end
return a
end
书上说: 虽然前面的代码看起来很无辜,并试图将表中元素的值保持在一个范围内,但这段代码会导致问题和循环引用。函数中的第一行 a = tbl[key] 实际上会触发另一个索引函数调用,而这又会调用另一个,依此类推。
但是 a = tbl[key] 如何在每次调用时调用另一个索引?
最佳答案
这有点奇怪。 Lua 只有在无法在表中找到字段时才会触发 __index
元方法。因此,在其中使用 tbl[key]
完全没有意义。除非 tbl
不是表格。
无论如何,如果您想从 __index
中访问表的字段,请使用 rawget
。这将确保不会调用元方法。
编辑:
让我解释一下 __index
查找是如何工作的:
假设该表有一个定义了 __index
的元表。
如果 Lua 在表中找不到键,它会在元表中查找 __index
字段。它不寻找 key 本身。然后,如果 __index
是一个表,它会在该表中查找键(不是元表,尽管元表本身与其 __index
字段相关联是很常见的) .如果它是一个函数,则使用两个参数调用它:table
(初始表,而不是元表)和 key
。
因此,如果 __index
元方法被调用,您可以确定初始表没有定义该字段。因此,当您尝试再次对其进行索引时(因为第一个参数是触发索引查找的原始表),故事重新开始 -> Lua 找不到键,它调用 __index
等等。
关于lua - lua and_index 函数中的元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22980959/