Comment obtenir le nombre d'entrées dans une table Lua?

Sonne comme un "let me google pour vous" question, mais de toute façon je ne peux pas trouver une réponse. Le Lua # opérateur ne prend en compte que les entrées avec entier clés, et ainsi de ne table.getn:

tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl))   -- prints "1     1"

count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count)            -- prints "2"

Comment puis-je obtenir le numéro de tous entrées sans les compter?

  • J'ai écrit un sérialiseur qui se souvient de chaque objet qu'il a vu, et la prochaine fois qu'il la voit, il émet un entier de référence à la place de l'objet. Le moyen naturel de le faire est d'écrire quelque chose comme dictionary[value] = #dictionary + 1, où # représente le nombre de tous les objets. Ce que je me demande pourquoi vous ne voulez pas que cela: dans tous les sane cas d'utilisation pour l' # (voir la réponse par kaizer.se), le nombre de tous les objets est exactement égal à ce # retourne déjà; il semble comme faire # compter tout ce qui est strictement une amélioration. Bien sûr, je suis un Lua débutant et peut-être à côté de la question.
  • Il n'est pas agréable de vous faire remettre en question le programmeur de la compétence en se demandant pourquoi il a besoin de faire quelque chose que toutes les langages de programmation ont une fonction simple pour.
  • Je ne remet pas en question a une personne de compétence. Je n'ai simplement jamais besoin de savoir combien d'entrées de la table a la.
  • Un autre exemple d'utilisation: récupérer beaucoup de données dans un tableau, où chaque élément de données est une chaîne unique d'identification. J'utilise cet identifiant comme la clé parce que je vais être à la recherche par la suite. Maintenant, je veux imprimer le nombre d'éléments de données traitées. Je dois tenir un comptoir et incrémenter manuellement pour chaque ligne. Certainement pas une grosse affaire, mais il est rare de ne pas être en mesure de dire quelque chose comme ceci sans compter, et depuis que vous avez demandé "pourquoi"... 🙂
  • Il n'est pas agréable de vous raconter l'une de Lua auteurs de langue que Lua n'est pas parmi les "raisonnable" des langages de programmation. 😉 BTW, je n'ai jamais nécessaire que l'information ainsi.
  • La table est le meilleur endroit pour conserver les informations sur l'objet courant comte, lorsqu'il est utilisé comme conteneur. Par exemple, lorsque la table est utilisée comme un Ensemble.
  • Je ne pense pas que j'ai jamais utilisé toutes les fonctionnalités d'une langue unique. Cela ne veut pas dire qu'ils ne sont pas utile à d'autres 🙂
  • Lua est mature et assez bien équilibré. Si il lui manque une fonctionnalité, cela signifie souvent que cette fonctionnalité serait la ruine de l'équilibre entre la simplicité, la flexibilité et la vitesse. Je pense que cette fonctionnalité.
  • Les threads sur Lua-l sur ce sujet sont innombrables. La plupart de la confusion de l'OMI provient du fait que Lua tables sont à la fois les tableaux et les tables de hachage, alors vous devez savoir. Contrairement à quelque chose comme JSON qui a séparé les représentations de chacun. Qui est le meilleur? Ni.
  • À mon avis, le # opérateur est juste mal définis. C'est donc facilement réparable: tout d'abord, faire # déterministe, et d'autre part, d'introduire un nouvel opérateur ou fonction pour obtenir le fameux comte. Fin de l'histoire... Pourquoi ont-ils pour être si têtu? 🙂
  • Pas sûr. Certes, il n'est pas le plus utile de l'opérateur, puisque vous avez à l'utiliser correctement pour être précis. Je suppose qu'il doit répondre à certains autres objectifs de la conception. Ce serait bien si il ne pourrait pas, au lieu de retourner des résultats non valides si
  • J'ai aussi eu un cas d'utilisation où j'ai besoin de savoir le nombre, dans ce cas j'ai besoin de savoir si il n'y a qu'un seul élément à gauche dans un tableau, dans ce cas, je la traiter différemment si il ya de nombreux éléments. Si la réponse est que nous les compter, c'est bien de bien; je suppose une fonction qui a eu la réponse nous aurait coûté la performance d'ailleurs (une telle fonctionnalité serait probablement besoin de lua pour tester la nouvelle et l'ancienne valeur de néant à chaque fois que nous avons établi un tableau de la valeur et ensuite mettre à jour un compteur en conséquence)
  • pour tester si il n'y a qu'une seule paire dans un tableau, utilisez next(t)~=nil and next(next(t))==nil.