# Introduction au Lua/Tables

Les modules Lua basés sur l'extension Scribunto sont enregistrés dans des pages appartenant à l'espace de nom "Module:" Chaque module utilise une table, pour organiser ses fonctions, variables comme pour retourner la réponse à la fin du code du module. Les tables sont des tableaux associatifs ou collections de données avec des paires Clé/Valeur qui servent à contenir, organiser et accéder aux données. Cette leçon montre comment utiliser les tables dans vos scripts.

## Prérequis

Cette leçon suppose que vous ayez assimilé la leçon Fonctions.

## Créer un script Lua avec des tables

* Accéder au Module:Sandbox.
* Supprimer le code existant.
* Ajouter le code suivant et enregistrer la page:

## Tester votre nouveau script

* Rendez-vous sur "votre page de test".
* Ajouter le code suivant et enregistrer la page:
Le résultat doit correspondre à ceci:

   ### sequence

       table[1] is 10
       table[2] is 20
       table[3] is 30

   ### dictionary

       table['es'] is Spanish
       table['ja'] is Japanese
       table['fr'] is French
       table['ru'] is Russian
       table['de'] is German
       table['ko'] is Korean
       table['en'] is English
       table['zh'] is Chinese
       table['it'] is Italian

## Comprendre le nouveau script
### Pour comprendre votre fonction tableToString

* local function tableToString(t) déclare une fonction locale nommée tableToString qui accepte un unique paramètre t, soit la table qui doit être convertie en chaine de de caractères.
* local et le code qui suit définit les variables key, value, et result. Toutes sont nil.
* result = '' assigne une chaine de caractères vide, comme valeur littérale à la variable result.
* for key, value in pairs(t) do créé un bloc de code pour la boucle qui incrémente les valeurs contenues dans les variables key et value pour chaque paire de données clé/valeur de la table t.
* if (tonumber(key) ~= nil) then test si la clé peut être convertie en nombre. Dans l'affirmative, la clé est affichée comme un nombre (sans guillemets) ; dans la négative la clé est affichée comme une chaine de caractères (avec guillemets).
* result = result .. ':table[' .. key .. '] is ' .. value .. '\n' or result = result .. ':table[\'' .. key .. '\'] is ' .. value .. '\n' ajoute la clé et sa valeur au résultat.
** La notation table[key] est la méthode commune pour faire référence à une clé afin d'accéder à sa valeur associée.
** Pour afficher des guillemets à l’intérieur d'une chaine de caractère, vous devez soit changer de guillemets (" et '), soit employer le caractère \ avant le guillemet, pour qu'il ne soit pas interprété comme guillemet fermant la chaine de caractères.
* end termine la boucle.
* return result retourne la valeur courante de la variable result en tant que résultat de la fonction.
* end termine la fonction.

### Pour comprendre la fonction sequence

* function p.sequence déclare la fonction nommée "sequence".
* local numbers = {10, 20, 30} définit une variable locale de type table, nommée numbers, qui est initialisée avec 3 valeurs.
    Quand les valeurs des tables sont précisées sans clé associée, Lua ajoute automatiquement une clé numérique à la valeur selon une séquence de 1 à N, le nombre de valeurs ajouté(e). Ce qui permet de manipuler les tables Lua comme n'importe quelle table avec un quelconque langage de programmation. Par exemple nous pouvons appeler la seconde valeur de la table de la façon suivante, numbers[2], de même les valeurs de la table peuvent être traitées dans une boucle. (par contre une liste au sens commun comme vous les connaissez sous python, devient nécessairement une table indexée par une clé numérique).
* local result définit la variable result et l'initialise comme nil.
* result = ';sequence\n' assigne une chaine de caractère littérale comme valeur de la variable result.
* result = result .. tableToString(numbers) appel la fonction tableToString lui passe la table numbers comme paramètre et concatène la valeur retournée dans la variable result.
* return result retourne la valeur courante de result comme résultat de la fonction.
* end termine la fonction.

### Pour comprendre la fonction dictionary

* function p.dictionary déclare une fonction nommée "dictionary".
* local languages = { et le code qui suit, définit une variable locale de type table nommée languages, qui est initialisée avec 9 paires "key/value" comprenez clé/valeur.
** Quand les valeurs sont précisées avec une clé associée, Lua utilise la clé spécifié en lieu et place de "l'index numérique automatique".
** Les tables Lua qui utilisent des clés spécifiées littéralement ne permettent pas d’appeler les valeurs de la façon suivante, table[number].
** Les tables Lua qui utilisent des clés spécifiées littéralement peuvent s'utiliser comme tableau associatif de la façon suivante table[key] c'est-à-dire languages['en'] dans notre exemple. Dans ce cas, les clés de type chaine de caractères sont indiquées entre guillemets.
** Les tables Lua qui utilisent des clés spécifiées littéralement peuvent s'utiliser comme tableau associatif de cette autre façon table.key c'est-à-dire languages.en. Ce format de notation vous dispense des guillemets.
* local result définit la variable result et l'initialise en tant que nil.
* result = ';dictionary\n' assigne une chaine de caractère littérale comme valeur de la variable result.
* result = result .. tableToString(languages) appel la fonction tableToString lui passe la table languages comme paramètre et concatène la valeur retournée avec la variable result.
* return result retourne la valeur courante result comme résultat de la fonction.
* end termine la fonction.
Il faut noter que la boucle qui traite les paires de donnée dans la table, va traiter toutes les valeurs de la table, mais les tables qui utilisent des clés précisées littéralement ne peuvent pas opérer les données dans l'ordre où elles ont été créés.

## Conclusion

Félicitation! Vous êtes capable de créer, tester et comprendre un script Lua qui manipule des tables, continuez avec la leçon Erreurs.