Bibliothèque table
La bibliothèque table fournit les opérations courantes sur les tables utilisées comme
« séquences » (tableaux indexés 1..n sans trou) : insertion, suppression, tri, concaténation,
empaquetage des arguments variadiques, fusion.
La plupart des fonctions acceptent, à la place d'une vraie table, n'importe quelle valeur dotée
d'une métatable fournissant les métaméthodes nécessaires (__index/__newindex/__len selon
l'opération), pour permettre d'utiliser ces fonctions sur des objets qui « se comportent » comme
des tables.
Vue d'ensemble
| Fonction | Description |
|---|---|
table.concat(list [, sep [, i [, j]]]) |
Concatène les éléments list[i..j] en une chaîne |
table.insert(list, [pos,] value) |
Insère value dans list, à pos ou en fin |
table.merge([deep,] t1, t2, ···) |
Fusionne t2, ··· dans t1 |
table.move(a1, f, e, t [, a2]) |
Déplace/copie une plage d'éléments entre tables |
table.pack(···) |
Empaquette ses arguments dans une nouvelle table |
table.remove(list [, pos]) |
Retire et retourne l'élément à pos |
table.sort(list [, comp]) |
Trie list en place |
table.unpack(list [, i [, j]]) |
Retourne les éléments list[i..j] comme valeurs multiples |
table.concat(list [, sep [, i [, j]]])
Étant donné une liste dont tous les éléments concernés sont des chaînes ou des nombres, retourne
la chaîne list[i]..sep..list[i+1]..· · ·..sep..list[j]. sep vaut la chaîne vide par défaut, i
vaut 1 et j vaut #list. Si i > j, retourne la chaîne vide. Lève une erreur si un élément de
la plage n'est pas une chaîne (ou un nombre convertible).
print(table.concat({ "a", "b", "c" }, ", ")) --> a, b, c
table.insert(list, [pos,] value)
Insère value à la position pos de list, décalant vers le haut les éléments
list[pos], list[pos+1], ···, list[#list]. Sans pos, insère value en fin de liste (équivalent
à pos = #list + 1). Lève une erreur si pos est hors de [1, #list + 1], ou si le nombre
d'arguments n'est ni 2 ni 3.
local t = { "a", "b", "c" }
table.insert(t, "d") -- { "a", "b", "c", "d" }
table.insert(t, 1, "z") -- { "z", "a", "b", "c", "d" }
table.remove(list [, pos])
Retire de list l'élément à la position pos, et le retourne. Quand pos est compris entre 1
et #list, décale vers le bas les éléments list[pos+1], ···, list[#list]. pos peut aussi
valoir 0 quand #list vaut 0, ou #list + 1 (retrait « au-delà de la fin », sans effet de
décalage). Par défaut, pos vaut #list (retire le dernier élément). Lève une erreur si pos est
hors de [1, #list + 1] (en tenant compte du cas 0).
local t = { "a", "b", "c" }
print(table.remove(t)) --> c (t == { "a", "b" })
print(table.remove(t, 1)) --> a (t == { "b" })
table.sort(list [, comp])
Trie les éléments de list, en place, de list[1] à list[#list]. comp, si fourni, est une
fonction de comparaison recevant deux éléments et retournant vrai si le premier doit précéder le
second dans l'ordre final ; sans comp, c'est l'opérateur < qui est utilisé. Le résultat n'est
garanti que si comp définit un ordre strict et cohérent (comme un opérateur < classique).
local t = { 5, 3, 1, 4, 2 }
table.sort(t)
table.sort(t, function(a, b) return a > b end) -- ordre décroissant
table.pack(···)
Retourne une nouvelle table contenant tous les arguments reçus, rangés aux clés 1, 2, ···, avec
en plus un champ n donnant le nombre total d'arguments. Comme certains arguments peuvent être
nil, la table résultante n'est pas nécessairement une séquence sans trou — utiliser le champ n
plutôt que # pour connaître le nombre réel d'éléments empaquetés.
local t = table.pack(1, nil, 3)
print(t.n, t[1], t[2], t[3]) --> 3 1 nil 3
table.unpack(list [, i [, j]])
Retourne les éléments de list comme autant de valeurs de retour : équivalent à
return list[i], list[i+1], ···, list[j]. i vaut 1 par défaut, j vaut #list par défaut. Ne
retourne aucune valeur si i > j.
local function f(...) return ... end
print(f(table.unpack({ 1, 2, 3 }))) --> 1 2 3
table.move(a1, f, e, t [, a2])
Déplace les éléments de la table a1 vers la table a2, équivalent à l'affectation multiple
a2[t], ··· = a1[f], ···, a1[e]. a2 vaut a1 par défaut, ce qui permet aussi bien de déplacer
des éléments à l'intérieur d'une même table que de les copier vers une autre — les plages source et
destination peuvent se chevaucher (le déplacement est fait dans le bon ordre pour éviter
d'écraser des valeurs pas encore lues). Retourne a2.
local t = { 1, 2, 3, 4, 5 }
table.move(t, 1, 3, 3) -- décale les 3 premiers éléments vers la position 3
-- t == { 1, 2, 1, 2, 3 }
table.merge([deep,] t1, t2, ···)
Fusionne toutes les paires clé/valeur de t2, ··· dans t1, et retourne t1. Une clé déjà
présente dans t1 est écrasée par la dernière table source qui la définit. Si le premier argument
deep (booléen, optionnel) vaut true, une valeur qui est une table à la fois dans la
destination et dans la table source est fusionnée récursivement au lieu d'être simplement écrasée
(les autres valeurs sont toujours remplacées).
local defaults = { a = 1, b = { x = 1, y = 2 } }
local overrides = { b = { y = 20, z = 3 }, c = 4 }
table.merge(true, defaults, overrides)
-- defaults == { a = 1, b = { x = 1, y = 20, z = 3 }, c = 4 }