__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]如何在每次调用时调用另一个索引?
答案 0 :(得分:5)
这有点奇怪。只有在表中找不到字段时,Lua才会触发__index
元方法。因此,在其中使用tbl[key]
完全没有任何意义。除非tbl
不是表格。
无论如何,如果您想从__index
中访问表格的字段,请使用rawget
。这将确保不会调用任何元方法。
修改强>
让我解释__index
查找的工作原理:
假设该表具有已定义__index
的元表。
如果Lua在表中找不到密钥,它会在metatable中查找__index
字段。它不寻找密钥本身。然后,如果__index
是一个表,它会查找该表中的键(不是metatable,尽管通常将metatable本身与其__index
字段相关联)。如果它是一个函数,则使用两个参数调用它:table
(初始表,而不是metatable)和key
。
因此,如果调用__index
元方法,则可以确定初始表没有定义该字段。因此,当您尝试再次索引它时(因为第一个参数是触发索引查找的原始表),故事重新开始 - &gt; Lua无法找到密钥,它会调用__index
等等。