【问题标题】:infinite recursion in __index metamethod__index 元方法中的无限递归
【发布时间】:2013-06-28 15:06:26
【问题描述】:

据我了解,除非在表中找不到密钥,否则 lua 不会调用 __index,因此我拥有该代码,并且它在 __index 部分中存在无限递归,而我没有得到因为 __index 函数中使用的两个值都已存在于表中!?

这基本上是一个测试脚本,用于尝试将表的大小保存在内存中以便在调用 # 时检索

    do
local lenKey,originalKey = {},{}
fastKey = {}
fastKey.__len = function(t) return t[lenKey] end
fastKey.__index = function (t,k)  
                        t[lenKey] = t[lenKey] +1
                        return t[oroginalKey][k] 
                end
fastKey.__newindex = function(t,k,v) t[originalKey][k] = v end
fastKey.__pairs = function ()
                    return  function (t, k)
                                return next(t[oroginalKey], k)
                            end
                end

function fastLen(t)
    local proxy = {}
    local c = 0
    for _ in pairs(t) do
        c=c+1
    end
    proxy[lenKey] = c                               
    proxy[originalKey] = t                                          
    setmetatable(proxy,fastKey)
    return proxy
end
end

n = fastLen{1,2,3,x=5}
--n:insert(1) -- here the __index is called and gets stackoverflow
print(#n)

【问题讨论】:

  • 试试originalKey 而不是oroginalKey
  • 嗯,这很蹩脚。我修改了很多次脚本都没见过,感谢帮助似乎还有其他逻辑错误我必须修复。
  • 别担心。发生在最好的情况下;)。

标签: lua


【解决方案1】:

你有两个错别字:__index__pairs 函数都包含 oroginalKey 而不是 originalKey

【讨论】:

  • 这个答案是对的,但是为了避免无限看你还应该考虑在访问元方法定义中的表时使用rawget
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
相关资源
最近更新 更多