Iteração Recursiva com pairs() e ipairs()

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Iteração Recursiva com pairs() e ipairs()

Eric Santos

Boa noite a todos!


Estive programando algumas coisas que saíam da minha cabeça baseado em estudos que eu fiz lendo o livro Programando Em Lua. Estou no capítulo de metatabelas, e ele apresenta o metamétodo "__tostring()". Resolvi então fazer um programa bem simples pra iterar sobre uma tabela e retornar os elementos dela como uma string. Porém, algo estranho ocorreu. Quando eu vou iterar na tabela usando o método "ipairs" em um laço for, o programa congela e fica em um processamento de loop infinito, o que não ocorre quando eu uso apenas o "pairs".


Há alguma explicação, e se possível, uma solução para o problema, já que é necessário se usar o "ipairs" para iterar sobre uma tabela respeitando a ordem de seus elementos?


Desde já, muito obrigado a compreensão!


Código usado:


-- tabela com as funções a serem executadas
mt = {}
 
Set = {}
function Set.new(l)
    local a = {}
    for i in ipairs(l) do
        a[i] = l[i]
        if type(l[i]) == "table" then
            a[i] = Set.new(l[i])
        end
    end
    setmetatable(a, mt)
    return a
end
 
 
function Set.add(a, b)
    c = {}
    local sA = #a
    local sB = #b
 
    for i = 1, sA do
        c[i] = a[i] or 0
    end
 
    for i = 1, sB do
        c[i + #c] = b[i] or 0
    end
    setmetatable(c, mt)
    return c
end
 
mt.__add = Set.add
 
mt.__index = function(table, key)
    return 0
end


 
-- Abaixo está o código "defeituoso"
mt.__tostring = function(v)
    exit = "{"
    first = true
    for i in pairs(v) do
        if type(v[i]) ~= "table" then
            if first then exit = exit .. v[i] first = false
            else exit = exit .. ", " .. v[i] end
        else
            if first then exit = exit .. tostring(v[i]) first = false
            else exit = exit .. ", " .. tostring(v[i]) end
        end
    end
    exit = exit .. "}"
    return exit
end
 
mt.__newindex = function(table, key)
    print("Try to write on " .. tostring(table) .. "[" .. key .. "] refused")
end
 
x1 = Set.new({1, 2, 3, 4, {10, 11, 12, {13, 14, 15}}})
x2 = Set.new({5, 6, 7, 8})
x3 = x1 + x2
 
print(#x3)
print(x3)
 
print("assigning...")
-- rawset é usada para contornar o bloqueio realizado por __newindex
rawset(x3, 15, 2)
 
print(x3[15])

 

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.