lua and_index函数中的元表

时间:2014-04-10 07:06:54

标签: 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

书说: 虽然前面的代码看起来非常无辜,并试图将表中元素的值保持在一个范围内,但此代码将导致问题和循环引用。函数中的第一行a = tbl [key]实际上会触发另一个索引函数调用,而这又会调用另一个,依此类推。

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

1 个答案:

答案 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等等。