English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

类型数据 Lua

Lua est un langage de programmation dynamique, les variables n'ont pas besoin de définition de type, il suffit d'affecter une valeur à la variable. Les valeurs peuvent être stockées dans des variables, transmises en tant que paramètres ou retournées en tant que résultats.

Il y a dans Lua }} 8 les types de base sont : nil, boolean, number, string, userdata, function, thread et table.

type de donnéesdescription
nilC'est le plus simple, car seule la valeur nil appartient à cette catégorie, représentant une valeur invalide (équivalente à false dans les expressions conditionnelles).
booleancontient deux valeurs : false et true.
numberreprésente un nombre flottant à double précision
stringune chaîne de caractères est représentée par un pair de guillemets doubles ou simples
functionfonction écrite en C ou en Lua
userdatareprésente une structure de données C stockée dans une variable
threadreprésente une ligne d'exécution indépendante, utilisée pour exécuter des coroutines
tableEn Lua, un tableau (table) est en réalité un "tableau associatif" (associative arrays), les indices peuvent être des nombres, des chaînes de caractères ou des tableaux. Dans Lua, la création d'un tableau est effectuée par une "expression de construction", la plus simple étant {} qui crée un tableau vide.

Nous pouvons utiliser la fonction type pour tester le type d'une variable ou d'une valeur donnée :

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 représente un type qui n'a aucune valeur valable, il n'a qu'une seule valeur -- nil, par exemple, si vous imprimez une variable non assignée, elle affichera une valeur nil :

> print(type(a))
nil
>

Pour les variables globales et les tableaux, nil a également une fonction "supprimer". Assigner une valeur nil à une variable globale ou à une variable dans un tableau équivaut à les supprimer. Exécuter le code suivant pour le voir :

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

lors de la comparaison avec nil, il faut ajouter les guillemets doubles " :

> type(X)
nil
> type(X)==nil
false
> type(X)=="nil"
true
>

le résultat de type(X)==nil est false la raison en est que type(X) est en réalité une chaîne de caractères "nil", c'est un type string :

type(type(X))==string

boolean (booléen)

Le type boolean a deux valeurs possibles : true (vrai) et false (faux), Lua considère false et nil comme false, et le reste comme true, le nombre 0 est aussi true :

print(type(true))
print(type(false))
print(type(nil))
 
if false or nil then
    print(\
else
    print(\
end
if 0 then
    print(\
else
    print(\
end

Le résultat de l'exécution du code suivant est le suivant :

$ lua test.lua 
boolean
boolean
nil
false et nil sont false
Le nombre 0 est true

number (nombre)

Lua a seulement un type number par défaut -- double (double précision) type (par défaut, le type peut être modifié dans luaconf.h), les suivant sont considérés comme des types number :

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 suivant est :

number
number
number
number
number
number

string (chaîne de caractères)

Les chaînes de caractères sont représentées par un couple de guillemets doubles ou simples.

string1 = "this is string"1"
string2 = 'this is string'2'

On peut aussi utiliser 2 Un paire de crochets "[[]]" pour représenter "un bloc" de chaîne de caractères.

Exemple en ligne

html = [[
<html>
<head></head>

    <a href=\//fr.oldtoolbag.com/">Base Tutorial Website</a>
</body>
</html>
]]
print(html)
Le résultat de l'exécution du code suivant est :
<html>
<head></head>

    <a href=\//fr.oldtoolbag.com/">Base Tutorial Website</a>
</body>
</html>

Lorsqu'il s'agit d'effectuer une opération arithmétique sur une chaîne de caractères numériques, Lua essaie de convertir cette chaîne de caractères numériques en un nombre :

> print(\2" + 6)
8.0
> print(\2" + "6")
8.0
> print(\2 + 6")
2 + 6
> print(\-2e2" * "6")
-1200.0
> print(\ + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: in ?
>

Dans le code suivant \ + 1L'exécution a échoué, la connexion de chaînes utilise .. , par exemple :

> print("a" .. 'b')
ab
> print(157 .. 428)
157428
>

Utilisez # pour calculer la longueur d'une chaîne de caractères, placez-le devant la chaîne de caractères, comme dans les exemples suivants :

> len = "fr.oldtoolbag.com"
> print(#len)
14
> print(#"fr.oldtoolbag.com"
14
>

table(tableau)

Dans Lua, la création d'une table se fait par "expression de construction", la plus simple expression de construction est {} pour créer une table vide. Vous pouvez également ajouter des données directement à la table pour l'initialiser :

-- Créer une table vide
local tbl1 ={}
 
-- initialisation directe de la table
local tbl2 ={"apple", "pear", "orange", "grape"}

En Lua, une table (tableau) est en réalité un "tableau associatif" (associative arrays), les indices peuvent être des nombres ou des chaînes de caractères.

-- fichier de script table_test.lua
a = {}
a["clé"] = "valeur"
clé = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

结果执行脚本:

$ lua table_test.lua 
clé : valeur
10 : 33

Contrairement aux tableaux d'autres langages qui commencent par l'index 0, dans Lua, l'index initial par défaut des tableaux est généralement : 1 commencez.

-- table_test2.lua 脚本文件
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Clé", key)
end

结果执行脚本:

$ lua table_test2.lua 
Clé    1
Clé    2
Clé    3
Clé    4

La table ne possède pas de taille fixe, elle augmente automatiquement de taille lorsque de nouvelles données sont ajoutées, et toutes les tables non initialisées sont nil.

-- table_test3.lua 脚本文件
a3 ={}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

结果执行脚本:

$ lua table_test3.lua 
val
nil

function(fonction)

En Lua, la fonction est considérée comme une "première classe de valeur (First-Classe Valeur)",la fonction peut exister dans une variable :

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

结果执行脚本:

$ lua function_test.lua 
120
120

function 可以以匿名函数(anonymous function)的方式通过参数传递:

-- 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)--函数匿名
        return key.."="..val;
end
);

结果执行脚本:

$ lua function_test2.lua 
key1 = val1
key2 = val2

thread(线程)

在 Lua 中,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

区别线程与协程:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

userdata(自定义类型)

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。