Lua-Datentypen

Lua ist eine dynamisch typisierte Sprache. Variablen benötigen keine Typdefinitionen; Sie weisen Variablen einfach Werte zu. Werte können in Variablen gespeichert, als Parameter übergeben oder als Ergebnisse zurückgegeben werden.

Lua hat 8 grundlegende Typen: nil, boolean, number, string, userdata, function, thread und table.

DatentypBeschreibung
nilDieser ist der einfachste. Nur der Wert nil gehört zu diesem Typ; er repräsentiert einen ungültigen Wert (entspricht false in Bedingungsausdrücken).
booleschEnthält zwei Werte: false und true.
numberStellt eine reelle Gleitkommazahl mit doppelter Genauigkeit dar.
stringStrings werden durch ein Paar doppelter Anführungszeichen oder einfacher Anführungszeichen repräsentiert.
FunktionFunktionen, die in C oder Lua geschrieben sind.
userdataStellt beliebige C-Datenstrukturen dar, die in Variablen gespeichert sind.
threadStellt einen unabhängigen Ausführungs-Thread dar, der zum Ausführen von Coroutinen verwendet wird.
tableEine Tabelle in Lua ist tatsächlich ein "assoziatives Array". Der Index des Arrays kann vom Typ Zahl, String oder Tabelle sein. In Lua werden Tabellen durch "Konstruktorausdrücke" erstellt. Der einfachste Konstruktorausdruck ist {}, mit dem eine leere Tabelle erstellt wird.

Wir können die Funktion type verwenden, um den Typ einer gegebenen Variable oder eines gegebenen Werts zu testen:

Beispiel

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 (leer)

Der Typ nil zeigt an, dass kein gültiger Wert vorhanden ist. Er hat nur einen Wert -- nil. Wenn man zum Beispiel eine Variable ausgibt, der kein Wert zugewiesen wurde, wird ein nil-Wert ausgegeben:

> print(type(a))
nil
>

Für globale Variablen und Tabellen hat nil auch einen "Lösch"-Effekt. Das Zuweisen eines nil-Werts zu einer globalen Variablen oder einer Variablen in einer Tabelle ist gleichbedeutend mit deren Löschung. Führen Sie den folgenden Code aus, um es zu erfahren:

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

Beim Vergleich mit nil sollten Sie doppelte Anführungszeichen hinzufügen.":

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

type(X)==nilDas Ergebnis istfalseDer Grund ist, dass type(X) tatsächlich einen"nil"string zurückgibt, was ein String-Typ ist:

type(type(X))==string

boolean (Boolean)

Der boolean-Typ hat nur zwei mögliche Werte: true und false. Lua behandelt false und nil als falsch, alles andere ist wahr, und die Zahl 0 ist ebenfalls wahr:

Beispiel

print(type(true))
print(type(false))
print(type(nil))
 
if false or nil then
    print("Mindestens einer ist wahr")
else
    print("Sowohl false als auch nil sind falsch")
end

if 0 then
    print("Zahl 0 ist wahr")
else
    print("Zahl 0 ist falsch")
end

Das Ausführungsergebnis des obigen Codes ist wie folgt:

$ lua test.lua 
boolean
boolean
nil
false 和 nil 都为 false
数字 0 是 true

number (Zahl)

Lua hat standardmäßig nur einen Zahlentyp -- den double-Typ (doppelte Genauigkeit) (der Standardtyp kann in den Definitionen von luaconf.h geändert werden). Die folgenden Notationen werden alle als Zahlentypen betrachtet:

Beispiel

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))

Das Ausführungsergebnis des obigen Codes:

number
number
number
number
number
number

string (String)

Strings werden durch ein Paar doppelter Anführungszeichen oder einfacher Anführungszeichen repräsentiert.

string1 = "this is string1"
string2 = 'this is string2'

Sie können auch doppelte eckige Klammern "[[]]" verwenden, um einen "Block" aus Zeichenketten darzustellen.

Beispiel

html = [[
<html>
<head></head>
<body>
<a href="http://www.example.com/">Beispiel-Tutorial</a>
</body>
</html>
]]

print(html)

Das Ausführungsergebnis des folgenden Codes ist:

<html>
<head></head>
<body>
    <a href="../index.html">Example</a>
</body>
</html>

Wenn arithmetische Operationen auf einer numerischen Zeichenkette ausgeführt werden, versucht Lua, diese numerische Zeichenkette in eine Zahl umzuwandeln:

> 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: Versuch, eine arithmetische Operation auf einem Wert vom Typ string auszuführen
Stack-Ablaufverfolgung:
        stdin:1: in main chunk
        [C]: in ?
>

Im obigen Code verursacht "error" + 1 einen Fehler. Die Verkettung von Zeichenketten verwendet .., zum Beispiel:

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

Verwenden Sie #, um die Länge einer Zeichenkette zu berechnen; es wird vor die Zeichenkette gesetzt, wie im folgenden Beispiel:

Beispiel

> len = "www.example.com"
> print(#len)
14
> print(#"www.example.com")
14
>

table (Table)

In Lua werden Tabellen durch "Konstruktor-Ausdrücke" erstellt. Der einfachste Konstruktor-Ausdruck ist {}, mit dem eine leere Tabelle erstellt wird. Du kannst auch einige Daten in die Tabelle einfügen und die Tabelle direkt initialisieren:

Beispiel

-- Leere Tabelle erstellen
local tbl1 = {}
 
-- Tabelle direkt initialisieren
local tbl2 = {"apple", "pear", "orange", "grape"}

Eine Tabelle in Lua ist eigentlich ein "assoziatives Array". Der Index des Arrays kann eine Zahl oder ein String sein.

Beispiel

-- table_test.lua-Skriptdatei
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

Das Ergebnis der Skriptausführung ist:

$ lua table_test.lua 
key : value
10 : 33

Im Gegensatz zu Arrays in anderen Sprachen, die 0 als Anfangsindex verwenden, beginnt der Standard-Anfangsindex einer Tabelle in Lua im Allgemeinen bei 1.

Beispiel

-- table_test2.lua Skriptdatei
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

Das Ergebnis der Skriptausführung ist:

$ lua table_test2.lua 
Key    1
Key    2
Key    3
Key    4

Eine Tabelle hat keine feste Länge. Wenn neue Daten hinzugefügt werden, wächst die Tabellenlänge automatisch. Nicht initialisierte Tabellen sind nil.

Beispiel

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

Das Ergebnis der Skriptausführung ist:

$ lua table_test3.lua 
val
nil

Funktion (Function)

In Lua werden Funktionen als "First-Class-Werte" angesehen. Funktionen können in Variablen gespeichert werden:

Beispiel

-- function_test.lua Skriptdatei
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))

Das Ergebnis der Skriptausführung ist:

$ lua function_test.lua 
120
120

Funktionen können als Argumente in Form von anonymen Funktionen übergeben werden:

Beispiel

-- function_test2.lua Skriptdatei
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)-- Anonyme Funktion
        return key.."="..val;
end
);

Das Ergebnis der Skriptausführung ist:

$ lua function_test2.lua 
key1=val1
key2=val2

Thread (Thread)

In Lua ist der Hauptthread die Coroutine. Er ähnelt einem Thread. Er hat seinen eigenen unabhängigen Stack, lokale Variablen und einen Instruktionszeiger und kann globale Variablen und die meisten anderen Dinge mit anderen Coroutinen teilen.

Der Unterschied zwischen Threads und Coroutinen: Mehrere Threads können gleichzeitig ausgeführt werden, aber zu jedem Zeitpunkt kann nur eine Coroutine ausgeführt werden, und eine laufende Coroutine pausiert nur, wenn sie angehalten wird.


userdata (Benutzerdefinierter Typ)

userdata ist ein benutzerdefinierter Datentyp, der verwendet wird, um einen Typ darzustellen, der von der Anwendung oder einer C/C++-Sprachbibliothek erstellt wurde. Er kann Daten jedes C/C++-Datentyps (normalerweise Structs und Zeiger) in Lua-Variablen speichern, um sie aufzurufen.

Andere Erweiterungen