Types de données Lua
Lua est un langage à typage dynamique. Les variables n'ont pas besoin de définitions de type ; il suffit d'attribuer des valeurs aux variables. Les valeurs peuvent être stockées dans des variables, passées comme paramètres ou renvoyées comme résultats.
Lua possède 8 types de base : nil, boolean, number, string, userdata, function, thread et table.
| Type de données | Description |
|---|---|
| nil | C'est le plus simple. Seule la valeur nil appartient à ce type, représentant une valeur invalide (équivalent à false dans les expressions conditionnelles). |
| booléen | Contient deux valeurs : false et true. |
| nombre | Représente un nombre réel à virgule flottante de type double précision. |
| string | Les chaînes sont représentées par une paire de guillemets doubles ou de guillemets simples. |
| fonction | Fonctions écrites en C ou en Lua. |
| userdata | Représente des structures de données C arbitraires stockées dans des variables. |
| thread | Représente un thread d'exécution indépendant, utilisé pour exécuter des coroutines. |
| table | Une table en Lua est en fait un « tableau associatif ». L'index du tableau peut être de type number, string ou table. En Lua, les tables sont créées via des « expressions de constructeur ». L'expression de constructeur la plus simple est {}, utilisée pour créer une table vide. |
Nous pouvons utiliser la fonction type pour tester le type d'une variable ou d'une valeur donnée :
Exemple
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
nil (vide)
Le type nil indique qu'il n'existe aucune valeur valide. Il n'a qu'une seule valeur -- nil. Par exemple, l'affichage d'une variable à laquelle aucune valeur n'a été attribuée produira une valeur nil :
> print(type(a)) nil >
Pour les variables globales et les tables, nil a également un effet de « suppression ». Attribuer une valeur nil à une variable globale ou à une variable dans une table équivaut à les supprimer. Exécutez le code suivant pour le savoir :
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
tab1.key1 = nil
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
Lorsque vous comparez nil, vous devez ajouter des guillemets doubles.":
nil
> type(X)==nil
false
> type(X)=="nil"
vrai
>
type(X)==nilLe résultat estfalseLa raison est que type(X) renvoie en fait une"nil"chaîne, qui est de type string :
type(type(X))==string
boolean (booléen)
Le type boolean n'a que deux valeurs possibles : true et false. Lua considère false et nil comme faux, tout le reste est vrai, et le nombre 0 est également vrai :
Exemple
print(type(false))
print(type(nil))
if false or nil then
print("Au moins un est vrai")
else
print("false et nil sont tous deux faux")
end
if 0 then
print("Le nombre 0 est vrai")
else
print("Le nombre 0 est faux")
end
Le résultat d'exécution du code ci-dessus est le suivant :
$ lua test.lua boolean boolean nil false 和 nil 都为 false 数字 0 是 true
number (Nombre)
Lua n'a qu'un seul type number par défaut -- le type double (double précision) (le type par défaut peut être modifié dans les définitions de luaconf.h). Les notations suivantes sont toutes considérées comme des types number :
Exemple
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))
Le résultat de l'exécution du code ci-dessus :
number number number number number number
string (String)
Les chaînes sont représentées par une paire de guillemets doubles ou de guillemets simples.
string1 = "this is string1" string2 = 'this is string2'
Vous pouvez également utiliser des doubles crochets "[[]]" pour représenter un "bloc" de chaîne.
Exemple
<html>
<head></head>
<body>
<a href="http://www.example.com/">Tutoriel d'exemple</a>
</body>
</html>
]]
print(html)
Le résultat de l'exécution du code suivant est :
<html>
<head></head>
<body>
<a href="../index.html">Example</a>
</body>
</html>
Lors de l'exécution d'opérations arithmétiques sur une chaîne numérique, Lua tentera de convertir cette chaîne numérique en nombre :
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: tentative d'effectuer une opération arithmétique sur une valeur de type string value
trace de la pile:
stdin:1: dans le bloc principal
[C]: in ?
>
Dans le code ci-dessus, "error" + 1 provoque une erreur. La concaténation de chaînes utilise .., par exemple :
> print("a" .. 'b')
ab
> print(157 .. 428)
157428
>
Utilisez # pour calculer la longueur d'une chaîne, en le plaçant avant la chaîne, comme dans l'exemple suivant :
Exemple
> print(#len)
14
> print(#"www.example.com")
14
>
table (Tableau)
En Lua, les tables sont créées par des "expressions de constructeur". L'expression de constructeur la plus simple est {}, utilisée pour créer une table vide. Vous pouvez également ajouter des données dans la table et initialiser directement la table :
Exemple
local tbl1 = {}
-- Initialiser directement la table
local tbl2 = {"apple", "pear", "orange", "grape"}
Une table en Lua est en fait un "tableau associatif". L'indice du tableau peut être un nombre ou une chaîne de caractères.
Exemple
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
print(k .. " : " .. v)
end
Le résultat de l'exécution du script est :
$ lua table_test.lua key : value 10 : 33
Contrairement aux tableaux dans d'autres langages qui utilisent 0 comme index initial, en Lua l'index initial par défaut d'une table commence généralement à 1.
Exemple
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
print("Key", key)
end
Le résultat de l'exécution du script est :
$ lua table_test2.lua Key 1 Key 2 Key 3 Key 4
Une table n'a pas de longueur fixe. Lorsque de nouvelles données sont ajoutées, la longueur de la table augmente automatiquement. Les tables qui ne sont pas initialisées sont nil.
Exemple
a3 = {}
for i = 1, 10 do
a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])
Le résultat de l'exécution du script est :
$ lua table_test3.lua val nil
function (Fonction)
En Lua, les fonctions sont considérées comme des « valeurs de première classe ». Les fonctions peuvent être stockées dans des variables :
Exemple
function factorial1(n)
if n == 0 then
return 1
else
return n * factorial1(n - 1)
end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))
Le résultat de l'exécution du script est :
$ lua function_test.lua 120 120
Les fonctions peuvent être passées comme arguments sous la forme de fonctions anonymes :
Exemple
function testFun(tab,fun)
for k ,v in pairs(tab) do
print(fun(k,v));
end
end
tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)-- Fonction anonyme
return key.."="..val;
end
);
Le résultat de l'exécution du script est :
$ lua function_test2.lua key1=val1 key2=val2
thread (Thread)
En Lua, le thread principal est la coroutine. Il est similaire à un thread. Il possède sa propre pile indépendante, ses variables locales et son pointeur d'instruction, et peut partager des variables globales et la plupart des autres choses avec d'autres coroutines.
La différence entre les threads et les coroutines : plusieurs threads peuvent s'exécuter simultanément, mais une seule coroutine peut s'exécuter à la fois, et une coroutine en cours d'exécution ne se met en pause que lorsqu'elle est suspendue.
userdata (Type personnalisé)
userdata est un type de données défini par l'utilisateur utilisé pour représenter un type créé par l'application ou une bibliothèque C/C++. Il peut stocker des données de n'importe quel type de données C/C++ (généralement des structures et des pointeurs) dans des variables Lua pour l'appel.
Autres extensions