元表在Lua中的使用和 and_index 函数。

__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] 如何在每次调用时调用另一个索引函数?

点赞
用户2198692
用户2198692

这似乎是不正常的行为。Lua只有在找不到表中的字段时才会触发__index元方法。因此,在其中使用tbl[key]根本毫无意义。除非tbl不是一个表。

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

编辑:

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

假设表具有定义了__index的元表。

如果Lua无法在表中找到键,则会查找元表中的__index字段。它不会查找键本身。然后,如果__index是一个表,它会在该表中查找键(不是元表,尽管通常将元表本身与其__index字段相关联)。如果它是一个函数,它将带有两个参数:table(初始表,而不是元表)和key

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

2014-04-10 07:34:39