Aller au contenu

Introduction au Lua/Tables

Leçons de niveau 12
Une page de Wikiversité, la communauté pédagogique libre.
Début de la boite de navigation du chapitre
Tables
Icône de la faculté
Chapitre no 10
Leçon : Introduction au Lua
Chap. préc. :Fonctions
Chap. suiv. :Erreurs
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Introduction au Lua : Tables
Introduction au Lua/Tables
 », n'a pu être restituée correctement ci-dessus.


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[1]. 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.

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

Créer un script Lua avec des tables

[modifier | modifier le wikicode]
  1. Accéder au Module:Sandbox.
  2. Supprimer le code existant.
  3. Ajouter le code suivant et enregistrer la page:
local p = {}
 
local function tableToString(t)
    local key
    local value
    local result
 
    result = ''
 
    for key, value in pairs(t) do
        if (tonumber(key) ~= nil) then
            result = result .. ':table[' .. key .. '] is ' .. value .. '\n' 
        else
            result = result .. ':table[\'' .. key .. '\'] is ' .. value .. '\n' 
        end
    end
 
    return result
end
 
function p.sequence()
    local numbers = {10, 20, 30}
    local result
 
    result = ';sequence\n'
    result = result .. tableToString(numbers)
 
    return result
end
 
function p.dictionary()
    local languages = {
        ['de'] = 'German',
        ['en'] = 'English', 
        ['es'] = 'Spanish', 
        ['fr'] = 'French',
        ['it'] = 'Italian',
        ['ja'] = 'Japanese',
        ['ko'] = 'Korean',
        ['ru'] = 'Russian',
        ['zh'] = 'Chinese'
    }
    local result
 
    result = ';dictionary\n'
    result = result .. tableToString(languages)
 
    return result
end
 
return p

Tester votre nouveau script

[modifier | modifier le wikicode]
  1. Rendez-vous sur "votre page de test".
  2. Ajouter le code suivant et enregistrer la page:
{{#invoke:Sandbox|sequence}}
{{#invoke:Sandbox|dictionary}}

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

[modifier | modifier le wikicode]

Pour comprendre votre fonction tableToString

[modifier | modifier le wikicode]
  1. 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.
  2. local et le code qui suit définit les variables key, value, et result. Toutes sont nil.
  3. result = '' assigne une chaine de caractères vide, comme valeur littérale à la variable result.
  4. 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.
  5. 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).
  6. 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.
  7. end termine la boucle.
  8. return result retourne la valeur courante de la variable result en tant que résultat de la fonction.
  9. end termine la fonction.

Pour comprendre la fonction sequence

[modifier | modifier le wikicode]
  1. function p.sequence() déclare la fonction nommée "sequence".
  2. 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).
  3. local result définit la variable result et l'initialise comme nil.
  4. result = ';sequence\n' assigne une chaine de caractère littérale comme valeur de la variable result.
  5. 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.
  6. return result retourne la valeur courante de result comme résultat de la fonction.
  7. end termine la fonction.

Pour comprendre la fonction dictionary

[modifier | modifier le wikicode]
  1. function p.dictionary() déclare une fonction nommée "dictionary".
  2. 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.
  3. local result définit la variable result et l'initialise en tant que nil.
  4. result = ';dictionary\n' assigne une chaine de caractère littérale comme valeur de la variable result.
  5. 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.
  6. return result retourne la valeur courante result comme résultat de la fonction.
  7. 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.

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

Lua for Wikiversity (en)