Tables
Les tables sont des collections d’entrées avec des clés et des valeurs. Il s’agit de la seule structure de données agrégées fournie. Toutes les autres structures de données (tableaux, listes, ensembles, etc.) sont construites à partir de tables. Les clés et les valeurs de table peuvent être n’importe quel type, y compris d’autres tables. Les clés et les valeurs d’une même table peuvent mélanger les types.
- Constructeurs de table
- Utilisation de la table
- Tables en tant que tableaux
- Tables en tant qu’enregistrements
Constructeurs de table
Les constructeurs de table vous permettent de spécifier une table avec des clés et des valeurs associées. La syntaxe est :
{[key1] = value1, [key2] = value2, …}
où les clés et les valeurs sont des expressions. Si les clés sont des chaînes qui ne sont pas des mots réservés, les crochets et les guillemets autour des clés peuvent être omis. Exemple :
{key1 = “value1”, key2 = “value2”, key3 = “value3”}
Une table vide est spécifiée simplement par {}.
Un constructeur de table peut être utilisé dans une affectation pour définir une variable pour faire référence à une table. Exemples :
local t1 = {} – set t1 to an empty table local t2 = {key1 = “value1”, key2 = “value2”, key3 = “value3”}
Notez que les tables elles-mêmes sont anonymes. Plusieurs variables peuvent faire référence à la même table. Poursuivant l’exemple ci-dessus :
t3 local = t2 - t2 et t3 se réfèrent à la même table
Utilisation de la table
Comme vous vous y attendiez, vous pouvez utiliser des clés pour trouver des valeurs dans une table. La syntaxe est la[clé]de table, où table est une référence de table (généralement une variable assignée à une table), et key est une expression fournissant la clé. Si cela est utilisé dans une expression et que la clé existe dans la table, cela renvoie la valeur associée à la clé. Si la clé n’est pas dans la table, cela renvoie nil. Si elle est utilisée comme variable dans une affectation et que la clé n’existe pas dans la table, elle crée une nouvelle entrée pour la clé et la valeur. Si la clé existe déjà dans la table, elle remplace la valeur de la clé par la nouvelle valeur. Exemples :
local t = {} — définit t sur une table vide t[« k1”] = « v1” — crée une entrée pour la clé « k1” et la valeur « v1” v1 = t[« k1”] — définit v1 à la valeur de la clé « k1” = « v1” t[« k1”] = « nouveau_v1” — définit la valeur de la clé « k1 » sur « new_v1”
Tableau en tant que tableaux
Le tableau traditionnel peut être implémenté en utilisant une table avec des clés entières comme indices. Un tableau peut avoir des indices, y compris négatifs, mais la convention est de démarrer des tableaux à l’index 1 (pas 0 comme c’est le cas avec des langages comme C et Java). Il existe un constructeur de table à usage spécial pour de tels tableaux :
{value1, value2, value3, … }
Les références de tableaux sont alors des[index de]tableaux.
L’opérateur de longueur # renvoie le nombre d’éléments dans un tableau avec des indices consécutifs commençant à 1. Exemple :
local a = {“value1”, “value2”, “value3”} local length = #a – sets length to the length of array a = 3
Les tableaux peuvent être clairsemés, où seuls les éléments définis sont alloués. Mais # ne peut pas être utilisé sur un tableau clairsemé avec des indices non consécutifs. Exemple :
local sparse_array = {} — configurer un tableau vide sparse_array[1] = « value1” — ajouter un élément à l’index 1 sparse_array[99] = « value99 » — ajouter un élément à l’index 99
Les tableaux multidimensionnels peuvent être configurés en tant que tables de tables. Par exemple, une matrice 3x3 peut être configurée par :
local m = {
{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
local v22 = m[2][2] — définit v22 à 5
Tables en tant qu’enregistrements
Les enregistrements avec des champs peuvent être implémentés sous forme de tables avec des clés de nom de champ. Le formulaire de référence table.field peut être utilisé pour la table[« field »]. Exemples :
local person = {name = “John Smith”, phone = “777-777-7777”} local name = person.name – sets name to “John Smith”
Un tableau de tables peut être utilisé pour une séquence d’enregistrements. Exemple :
local people = { {name = “John Smith”, phone = “777-777-7777”}, {name = “Jane Doe”, phone = “888-888-8888”} … }
name = people[2].name — définit le nom sur « Jane Doe »