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[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.
Prérequis
[modifier | modifier le wikicode]Cette leçon suppose que vous ayez assimilé la leçon Fonctions.
Créer un script Lua avec des tables
[modifier | modifier le wikicode]- Accéder au Module:Sandbox.
- Supprimer le code existant.
- 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]- Rendez-vous sur "votre page de test".
- 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]local function tableToString(t)
déclare une fonction locale nomméetableToString
qui accepte un unique paramètret
, soit la table qui doit être convertie en chaine de de caractères.local
et le code qui suit définit les variableskey
,value
, etresult
. Toutes sontnil
.result = ''
assigne une chaine de caractères vide, comme valeur littérale à la variableresult
.for key, value in pairs(t) do
créé un bloc de code pour la boucle qui incrémente les valeurs contenues dans les variableskey
etvalue
pour chaque paire de données clé/valeur de la tablet
.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'
orresult = 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.
- La notation
end
termine la boucle.return result
retourne la valeur courante de la variableresult
en tant que résultat de la fonction.end
termine la fonction.
Pour comprendre la fonction sequence
[modifier | modifier le wikicode]function p.sequence()
déclare la fonction nommée "sequence".local numbers = {10, 20, 30}
définit une variable locale de type table, nomméenumbers
, 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).
- 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,
local result
définit la variableresult
et l'initialise commenil
.result = ';sequence\n'
assigne une chaine de caractère littérale comme valeur de la variableresult
.result = result .. tableToString(numbers)
appel la fonctiontableToString
lui passe la tablenumbers
comme paramètre et concatène la valeur retournée dans la variableresult
.return result
retourne la valeur courante deresult
comme résultat de la fonction.end
termine la fonction.
Pour comprendre la fonction dictionary
[modifier | modifier le wikicode]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éelanguages
, 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-à-direlanguages['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-à-direlanguages.en
. Ce format de notation vous dispense des guillemets.
local result
définit la variableresult
et l'initialise en tant quenil
.result = ';dictionary\n'
assigne une chaine de caractère littérale comme valeur de la variableresult
.result = result .. tableToString(languages)
appel la fonctiontableToString
lui passe la tablelanguages
comme paramètre et concatène la valeur retournée avec la variableresult
.return result
retourne la valeur couranteresult
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
[modifier | modifier le wikicode]Félicitation! Vous êtes capable de créer, tester et comprendre un script Lua qui manipule des tables, continuez avec la leçon Erreurs.
Voir aussi
[modifier | modifier le wikicode]Références
[modifier | modifier le wikicode]