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éesDescription
nilC'est le plus simple. Seule la valeur nil appartient à ce type, représentant une valeur invalide (équivalent à false dans les expressions conditionnelles).
booléenContient deux valeurs : false et true.
nombreReprésente un nombre réel à virgule flottante de type double précision.
stringLes chaînes sont représentées par une paire de guillemets doubles ou de guillemets simples.
fonctionFonctions écrites en C ou en Lua.
userdataReprésente des structures de données C arbitraires stockées dans des variables.
threadReprésente un thread d'exécution indépendant, utilisé pour exécuter des coroutines.
tableUne 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("Hello world"))      --> string
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 :

tab1 = { key1 = "val1", key2 = "val2", "val3" }
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.":

> type(X)
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(true))
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))
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 = [[
<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 :

> print("2" + 6)
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

> len = "www.example.com"
> 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

-- Créer une table vide
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

-- fichier de script table_test.lua
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

-- fichier de script table_test2.lua
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

-- fichier de script table_test3.lua
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

-- fichier de script function_test.lua
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

-- fichier de script function_test2.lua
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