【发布时间】:2014-05-23 17:48:19
【问题描述】:
__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] 如何在每次调用时调用另一个索引?
【问题讨论】:
-
因为
tbl[key]会触发同样的__index事件。 -
@EgorSkriptunoff :我想问的是,为什么是这条链?该索引被调用,然后它又调用另一个索引函数。为什么会这样?
-
@Simrankaur 这是因为如果一个表有一个带有
__index元方法的元表并且Lua 在表中找不到键,它会调用__index查找。如果它实际上是一张表,则调用__index意味着该键不存在。因此,再次调用tbl[key]肯定会一次又一次地触发__index元方法,并且... -
@Simrankaur - 在
__index处理程序内部和外部的 Lua 代码中生成索引事件没有区别。 -
@Simrankaur 不,不,请参阅我的答案的编辑。 Lua 根本不会扫描 metatable 的那个键。它仅扫描
__index字段的元表。如果元表的__index字段指向元表本身,它将仅在元表中查找键。
标签: lua