lua and_index函数中的元表

Sim*_*aur 2 lua

__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
Run Code Online (Sandbox Code Playgroud)

书中说:尽管前面的代码看起来很单纯,并且试图将表中元素的值保持在一定范围内,但是该代码会引起问题和循环引用。函数的第一行a = tbl [key]实际上会触发另一个索引函数调用,然后又将调用另一个索引函数,依此类推。

但是a = tbl [key]如何在每次调用时调用另一个索引?

W.B*_*.B. 6

这有点奇怪。Lua __index仅在无法在表中找到字段时才触发元方法。因此,tbl[key]在内部使用绝对没有任何意义。除非tbl不是表。

无论如何,如果您想从内部访问表的字段__index,请使用rawget。这将确保不调用任何元方法。

编辑:

让我解释一下__index查询的工作原理:

假设该表具有一个已__index定义的元表。

如果Lua在表中找不到键,它将__index在元表中查找该字段。它不查找密钥本身。然后,如果__indexs是一个表,它将在该表中查找键(而不是metatable,尽管通常将metatable本身与其__index字段相关联)。如果它是一个函数,则使用两个参数来调用它:(table初始表,而不是元表)和key

因此,如果__index调用了元方法,则可以确定初始表没有定义该字段。因此,当您尝试再次为其建立索引(因为第一个参数是触发索引查找的原始表)时,故事重新开始-> Lua找不到键,它会调用__index诸如此类。