Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 索引元方法中的无限递归_Lua - Fatal编程技术网

Lua 索引元方法中的无限递归

Lua 索引元方法中的无限递归,lua,Lua,据我所知,除非在表中找不到键,否则lua不会调用\uuuu index,因此我有该代码,并且它在u index部分遭受无限递归,我没有得到,因为在u index函数中使用的两个值都已存在于表中 这基本上是一个测试脚本,用于尝试将表的大小保存在内存中,以便在调用#时检索 do local lenKey,originalKey = {},{} fastKey = {} fastKey.__len = function(t) return t[lenKey] end fastKey.__ind

据我所知,除非在表中找不到键,否则lua不会调用\uuuu index,因此我有该代码,并且它在u index部分遭受无限递归,我没有得到,因为在u 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)

这里有两个输入错误:
\uuu索引
\uu对
函数都包含
oroginalKey
而不是
originalKey

试试
originalKey
而不是
oroginalKey
。嗯,这太差劲了。我修改了很多次脚本,从来没有见过它,谢谢你的帮助,似乎还有其他的逻辑错误我必须修复。不要担心。发生在最好的人身上;)。这个答案是正确的,但是为了避免无限的外观,在访问元方法定义时,还应该考虑使用<代码> RWGET < /Cord>。