Stanley Sathler Posted December 10, 2015 Share Posted December 10, 2015 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
n3wage Posted December 10, 2015 Share Posted December 10, 2015 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 Link to comment
Stanley Sathler Posted January 10, 2016 Author Share Posted January 10, 2016 n3wage, cara, por sorte eu li essa micro nota de rodapé. 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now