web-dev-qa-db-fra.com

Quelle est la différence entre table.insert (t, i) et t [# t + 1] = i?

Dans Lua, il semble y avoir deux façons d'ajouter un élément à un tableau:

table.insert(t, i)

et

t[#t+1] = i

Que dois-je utiliser et pourquoi?

29
Eric

Lequel utiliser est une question de préférence et de circonstance: comme # l'opérateur de longueur a été introduit dans la version 5.1, t[#t+1] = i ne fonctionnera pas dans Lua 5.0, tandis que table.insert est présent depuis la version 5.0 et fonctionnera dans les deux. D'autre part, t[#t+1] = i utilise exclusivement des opérateurs au niveau de la langue, tandis que table.insert implique une fonction (qui a une légère surcharge à rechercher et à appeler et dépend du module table dans l'environnement).

Dans la deuxième édition de Programmation en Lua (une mise à jour de la première édition orientée Lua 5.0), Roberto Ierusalimschy (le concepteur de Lua) déclare qu'il préfère t[#t+1] = i, car c'est plus visible.


En outre, selon votre cas d'utilisation, la réponse peut être "ni". Voir l'entrée manuelle sur le comportement de l'opérateur de longueur :

Si le tableau a des "trous" (c'est-à-dire des valeurs nulles entre d'autres valeurs non nulles), alors #t peut être l'un des indices qui précède directement une valeur nulle (c'est-à-dire qu'il peut considérer une telle valeur nulle comme la fin du tableau).

En tant que tel, si vous avez affaire à un tableau avec des trous, utilisez l'un ou l'autre ( table.insert utilise l'opérateur de longueur ) peut "ajouter" votre valeur à un index plus bas que vous le souhaitez dans le tableau. La façon dont vous définissez la taille de votre tableau dans ce scénario dépend de vous et, encore une fois, dépend des préférences et des circonstances: vous pouvez utiliser table.maxn (disparaissant en 5.2 mais trivial à écrire), vous pouvez conserver un champ n dans le tableau et le mettre à jour si nécessaire, vous pouvez envelopper le tableau dans un metatable, ou vous pouvez utiliser une autre solution qui convient mieux votre situation (en boucle, un local tsize dans la portée immédiatement en dehors de la boucle suffit souvent).

38

Ce qui suit est légèrement amusant, mais peut-être avec un grain d'esthétique. Même s'il existe des raisons évidentes pour lesquelles mytable:operation() n'est pas fourni comme mystring:operation(), on peut facilement rouler sa propre variante et obtenir une troisième notation si désiré.

Table = {}
Table.__index = table                     

function Table.new()
   local t = {}
   setmetatable(t, Table)
   return t
end

mytable = Table.new()
mytable:insert('Hello')
mytable:insert('World')
for _, s in ipairs(mytable) do
   print(s)
end
7
AndersH

insert peut insérer arbitrairement (comme son nom l'indique), il ne fait par défaut que #t + 1, tandis que t[#t + 1] = i sera toujours ajouté à la (fin du) tableau. voir la section 5.5 dans le manuel lua .

1
Necrolis

L'opérateur '#' utilise uniquement la table de clés indexées.

t = {1, 2 ,3 ,4, 5, x=1, y=2}

au-dessus du code

print(#t)  --> print 5 not 7

Opérateur '#' chaque fois qu'il n'est pas utilisé.

Si vous souhaitez utiliser l'opérateur "#", cochez-le pour le type d'éléments de table.

La fonction d'insertion peut utiliser n'importe quel type d'utilisation.Mais le nombre d'éléments fonctionne plus lentement que '#'

0
gogothing