Jump to content

pairs() ordena array incorretamente. Por quê?


Recommended Posts

Oi pessoal,

Primeiramente, extremamente feliz em ver a seção de Programação ficando finalmente movimentada, já que no passado era uma das mais abandonadas.

Vocês têm alguma ideia do porquê do ipairs() tratar uma tabela associativa de forma incorreta? O que quero dizer, é:

  
table = { 
  ammo = "Ammo", 
  primary = "Primary Weapons", 
  secondary = "Secondary Weapons" 
} 
  

Se eu dou um pairs(tabela), a interação meio que me devolve uma ordem do tipo primary, ammo, secondary. Pensei "ah, deve estar ordenando as chaves por ordem alfabética" (já que minha tabela não consistia apenas nestes valores), mas em ordem alfabética não é, afinal, o "items" vinha primeiro e, o "ammo", só no final.

Li em vários lugares, mas não encontrei uma resposta concreta. Como resolução final, precisei fazer uma gambiarra do tipo:

table = { 
  ammo = {"Ammo", 1}, 
  primary = {"Primary", 2}, 
  secondary = {"Secondary", 3} 
} 
  
function iAmHandsome() 
  local reordered = {} 
  for i, item in pairs(table) do 
    table.insert(reordered, item[2], item[1]) 
  end 
  return reordered 
end 

Alguma ideia do porquê isso acontecer? E uma alternativa que não seja essa putaria que eu fiz?

Link to comment

Como dito no manual da linguagem ipairs percorre a tabela pelos índices numéricos (Como sua tabela não tem nenhum ele não percorre nada), Já pairs percorre a tabela em uma ordem arbitrária.

Sobre sua gambiarra, Não entendi muito bem oque você quer fazer, Iterar a tabela na ordem correta ? Se sim acho que essa é a melhor maneira (talvez tenha outras como usar iteradores personalizados?).

Referências:

1 2 3

ot: como você consegue usar só 2 espaços em vez de 4? acho que isso deixa o código mais feio xD

Link to comment
  • 5 weeks later...

n3wage, cara, por sorte eu li essa micro nota de rodapé. :lol::lol: Onde eu trabalho definimos um padrão de sempre usar dois espaços, então acabei me acostumando. No começo foi difícil, mas uma hora vai.

Então, eu na verdade até sabia dessa diferença entre pairs() e ipairs(). O que na época achei estranho foi a ordem com que as funções navegavam em meu array. Parecia que em algum momento, a ordem da minha tabela era alterada, sabe? Ela não era lida na mesma sequência em que foi declarada.

Eu declarei minha tabela com esta ordem: Ammo, Primary e Secondary. Mas quando usava pairs(), é como se fosse lida nesta ordem: Secondary, Ammo, Primary. Eu chequei, e não estava em ordem alfabética, que foi a primeira coisa que me veio à cabeça quando vi a ordem ser alterada. Aí queria saber o quê que estava acontecendo... o porquê da ordem ser alterada, sacou?

Na verdade o problema nem era no pairs(), porque se formos pensar, quando eu uso a função para reordenar a tabela, eu uso um pairs() no resultado retornado. Se o problema fosse no pairs(), ia avacalhar a ordem de novo. É como se a minha tabela já fosse armazenada na memória erroneamente. E sim, a gambiarra era pra fazer exatamente o que você disse, forçar uma reordenação na forma correta.

E essa gambiarra continua lá no código.... hahahaha.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...