Comment supprimer une entrée de table lua par sa clé?

94

J'ai une table lua que j'utilise comme hashmap, c'est à dire avec des clés de chaîne:

local map = { foo = 1, bar = 2 }

Je voudrais "pop" un élément de cette table identifié par sa clé. Il existe une table.remove()méthode, mais elle ne prend que l'index de l'élément à supprimer (c'est-à-dire un nombre) et non une clé générique. J'aimerais pouvoir le faire table.remove(map, 'foo')et voici comment je l'ai implémenté:

function table.removekey(table, key)
    local element = table[key]
    table[key] = nil
    return element
end

Y a-t-il une meilleure façon de faire cela?

Wookai
la source
4
+1 à la question très utile parce que vous avez donné la «réponse» dont j'avais besoin; même s'il n'y a pas de «meilleur» moyen.
Ian Boyd

Réponses:

82

Non, définir la valeur de la clé sur nilest la manière acceptée de supprimer un élément dans la partie hashmap d'une table. Ce que vous faites est standard. Cependant, je vous recommande de ne pas remplacer table.remove()- pour la partie tableau d'une table, la fonctionnalité par défaut table.remove () inclut la renumérotation des index, ce que votre remplacement ne ferait pas. Si vous voulez ajouter votre fonction à l' tableensemble de fonctions, je lui donnerais probablement quelque chose comme table.removekey()ou quelque chose comme ça .

ambre
la source
Merci pour les commentaires sur la suppression. À propos du nom de la fonction, c'était principalement pour clarifier mon point. Je ne remplace généralement pas les fonctions standard. Je ne l'utiliserai certainement pas sous ce nom (ce table.removekey()serait aussi mon meilleur choix).
Wookai
1
Si vous ne l'utilisez que dans un seul bloc, vous serez encore mieux en termes de performances en en faisant simplement une fonction locale à la place (économise la surcharge d'une recherche globale pour chaque appel). J'importe souvent table.insertet table.removedans l'espace de noms local si je les utilise fréquemment, souvent comme quelque chose comme tinsert()et tremove().
Ambre
Merci pour le conseil de performance. Je vais essayer d'importer les fonctions que j'utilise souvent dans l'espace de noms local pour voir si cela fait une grande différence.
Wookai
Notez que vous devez utiliser table.remove (indez, position) au lieu de le mettre à nil pour que les index soient décrémentés et donc les éléments repositionnés.
@HakanBoztepe Cela n'est pas pertinent pour la partie hashmap de la table (clés de chaîne).
Amber