lua - lua and_index 函数中的元表

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

最佳答案

这有点奇怪。 Lua 只有在无法在表中找到字段时才会触发 __index 元方法。因此,在其中使用 tbl[key] 完全没有意义。除非 tbl 不是表格。

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

编辑:

让我解释一下 __index 查找是如何工作的:

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

如果 Lua 在表中找不到键,它会在元表中查找 __index 字段。它不寻找 key 本身。然后,如果 __index 是一个表,它会在该表中查找键(不是元表,尽管元表本身与其 __index 字段相关联是很常见的) .如果它是一个函数,则使用两个参数调用它:table(初始表,而不是元表)和 key

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

关于lua - lua and_index 函数中的元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22980959/

相关文章:

lua - 如何从 Lua 中的字符串中删除某些特殊字符?

C++ 将已存在的对象实例公开给脚本语言

lua - 如何限制 lua 的可能性(调用 OS 函数、模块等)

lua - 通过 Lua 脚本重启系统

mysql - ERROR 1105 (HY000) : #07000MySQL Proxy Lua script failed to load. 查看错误日志

Lua:我需要在 if 中重复变量吗?

lua - 指导我为 Aerospike 编写聚合(groupBy、orderBy)Lua 脚本

linux - 使用 lsyncd 同步多个目录

lua - 如何开始使用可嵌入脚本?

lua - 您如何干净地退出交互式Lua?