English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Lua ist eine dynamische Typensprache, Variablen benötigen keine Typdefinitionen, sondern müssen nur zugewiesen werden. Werte können in Variablen gespeichert werden, um als Parameter übergeben oder als Ergebnis zurückgegeben zu werden.
In Lua gibt es 8 Die grundlegenden Typen sind: nil, boolean, number, string, userdata, function, thread und table.
Datenart | Beschreibung |
---|---|
nil | Das ist am einfachsten, nur der Wert nil gehört zu dieser Kategorie und stellt einen ungültigen Wert dar (entspricht false in bedingten Ausdrücken). |
boolean | enthält zwei Werte: false und true. |
number | stellt einen reellen Fließkommawert des Doubel-Typs dar |
string | String werden durch ein Paar doppelte oder einfache Anführungszeichen dargestellt |
function | von C oder Lua geschriebene Funktionen |
userdata | stellt eine C-Datenstruktur dar, die in einer Variable gespeichert ist |
thread | stellt eine unabhängige Ausführungslinie dar, die zum Ausführen von Collaborationsprogrammen verwendet wird |
table | In Lua ist eine Tabelle (table) eigentlich ein "assoziatives Array" (associative arrays), deren Index eine Zahl, ein String oder ein Tabellen-Typ sein kann. In Lua wird eine Tabelle durch eine "Konstruktionsausdrucksform" erstellt, der einfachste Ausdruck ist {}, der eine leere Tabelle erstellt. |
Wir können die Funktion type verwenden, um den Typ eines gegebenen Variablen oder Wertes zu testen:
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
Der nil-Typ stellt eine Art von Wert dar, der keine gültige Werte hat, und hat nur einen Wert -- nil, z.B. wenn eine Variable nicht zugewiesen wird, wird ein nil-Wert ausgegeben:
> print(type(a)) nil >
Für globale Variablen und Tabellen hat nil auch eine "Lösch"-funktion. Eine nil-Wertzuweisung an eine globale Variable oder eine Variable in der Tabellenliste entspricht dem Entfernen dieser Variablen. Dies zeigt das folgende Codebeispiel:
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
> type(X) nil > type(X) == nil false > type(X) == "nil" true >
type(X) == nil ergibt false der Grund ist, dass type(X) tatsächlich die "nil"-Zeichenkette zurückgibt, die ein String-Typ ist:
type(type(X)) == string
Der boolean-Typ hat nur zwei mögliche Werte: true (wahr) und false (falsch), Lua betrachtet false und nil als false, alles andere ist true, auch die Zahl 0 ist true:
print(type(true)) print(type(false)) print(type(nil)) if false or nil then print("Zumindest eins ist true") else print("false und nil sind false") end if 0 then print("Die Zahl 0 ist true") else print("Die Zahl 0 ist false") end
Das Ergebnis des folgenden Codes ist wie folgt:
$ lua test.lua boolean boolean nil false und nil sind false Die Zahl 0 ist true
Lua hat standardmäßig nur einen number-Typ -- double (Doppelpunktzahl) Typ (Standardtyp kann in luaconf.h geändert werden), die folgenden Schreibweisen werden als number-Typ betrachtet:
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 Ergebnis des folgenden Codes ist:
number number number number number number
Zeichenketten werden durch ein Paar doppelte oder einfache Anführungszeichen dargestellt.
string1 = "this is string1" string2 = 'this is string2'
Man kann auch 2 ein Paar eckige Klammern "[[]]" wird verwendet, um "einen Block" Zeichenkette zu darstellen.
html = [[ <html> <head></head> <body> <a href="http://de.oldtoolbag.com/">Grundlegende Anleitung</a> </body> </html> ]] print(html)Das Ergebnis des folgenden Codes ist:
<html> <head></head> <body> <a href="http://de.oldtoolbag.com/">Grundlegende Anleitung</a> </body> </html>
Lua versucht, eine Zeichenkette, die als numerischer String interpretiert wird, in eine Zahl zu konvertieren:
> 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 einen Zeichenkettenwert durchzuführen stack traceback: stdin:1: in main chunk [C]: in ? >
Der Code enthält "error" + 1Die Ausführung hat einen Fehler, die Zeichenkette wird mit .. verbunden, z.B.:
> print("a" .. 'b') ab > print(157 .. 428) 157428 >
Die Länge eines Strings kann mit # berechnet werden, indem es vor dem String gestellt wird, wie im folgenden Beispiel gezeigt:
> len = "de.oldtoolbag.com" > print(#len) 14 > print(#"de.oldtoolbag.com) 14 >
Die Erstellung einer Tabelle in Lua wird durch das "Konstruktionsausdruck" durchgeführt, der einfachste Konstruktionsausdruck ist {}, um eine leere Tabelle zu erstellen. Es kann auch Daten in die Tabelle hinzufügen und die Tabelle direkt initialisieren:
-- Eine leere Tabelle erstellen local tbl1 = {} -- Direkte Initialisierung der Tabelle local tbl2 = {"apple", "birne", "orange", "traube"}
In Lua ist die Tabelle (table) eigentlich ein "assoziatives Array" (associative arrays), der Index der Array kann eine Zahl oder ein String sein.
-- 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
脚本执行结果为:
$ lua table_test.lua Schlüssel : Wert 10 : 33
Im Gegensatz zu Arrays anderer Sprachen wird 0 als der Anfangsindex des Arrays verwendet, in Lua ist der Standardanfangsindex der Tabelle in der Regel 1 Beginn.
-- table_test2.lua 脚本文件 local tbl = {"apple", "birne", "orange", "traube"} for key, val in pairs(tbl) do print("Schlüssel", key) end
脚本执行结果为:
$ lua table_test2.lua Schlüssel 1 Schlüssel 2 Schlüssel 3 Schlüssel 4
Die Tabelle hat keine festgelegte Länge, wächst die Länge der Tabelle automatisch, wenn neue Daten hinzugefügt werden, und jede ursprüngliche Tabelle ist 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
In Lua werden Funktionen als "erste Klasse Wert (First Class Value)" betrachtet-Class Value)",Funktion kann in Variablen existieren:
-- 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))
脚本执行结果为:
$ 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
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。