Menu
Coddy logo textTech

Luau-Cheatsheet

Prüfmodi

Ein Kommentar in der ersten Zeile entscheidet, wie streng Luau prüft.

ModusSyntax
Keine Typprüfung--!nocheck
Standard: prüft Annotiertes--!nonstrict
Strict: leitet ab und prüft alles--!strict
Datei ausführenluau main.luau
Typen prüfen ohne Ausführenluau-analyze main.luau
Eine Lint-Warnung abschalten--!nolint UnknownGlobal

Basistypen

Die primitiven Typen und wie du eine Variable annotierst.

OperationSyntax
Zahllocal age: number = 25
Stringlocal name: string = "Ada"
Booleanlocal ok: boolean = true
Optional (kann nil sein)local nick: string? = nil
Any (keine Prüfung)local x: any = f()
Unknown (sicheres any)local x: unknown = f()
Never (wirft immer)function fail(): never error("boom") end
Nillocal n: nil = nil
Coroutine / Bufferlocal co: thread, local b: buffer
Abgeleitet - keine Annotation nötiglocal hp = 100 -- number

Typisierte Tabellen: Arrays & Maps

Es bleiben Lua-Tabellen - der Typ sagt, was drin ist.

OperationSyntax
Array von Zahlenlocal xs: {number} = {1, 2, 3}
Array von Stringslocal names: {string} = {}
Map (String-Schlüssel)local ages: {[string]: number} = {}
Map (beliebiger Schlüsseltyp)local seen: {[Player]: boolean} = {}
Verschachteltes Arraylocal grid: {{number}} = {}
Array von Formenlocal items: {{id: number}} = {}
Nur-Lese-Arraylocal t = table.freeze({1, 2, 3})
Iterieren (generalisiert, nur Luau)for i, v in xs do print(i, v) end
Schlüssel und Werte iterierenfor k, v in pairs(ages) do end

Funktionen

Annotiere Parameter und Rückgabetyp; -> () heißt: gibt nichts zurück.

OperationSyntax
Typisierte Parameter + Rückgabefunction add(a: number, b: number): number
Gibt nichts zurückfunction log(msg: string): () end
Mehrere Rückgabenfunction split(s: string): (string, string)
Optionaler Parameterfunction greet(name: string?) end
Standardwertfunction greet(name: string?) name = name or "friend" end
Variadischfunction sum(...: number): number end
Anonyme Funktionlocal f = function(x: number): number return x * 2 end
Funktionstyptype Adder = (number, number) -> number
Callback-Parameterfunction each(f: (number) -> ()) end

Typaliase, Unions & Literale

Einen Typ einmal benennen und überall wiederverwenden.

OperationSyntax
Alias für ein Primitivtype Health = number
Uniontype Id = number | string
Optional = Union mit niltype Maybe = string | nil -- same as string?
Literaltyp (Singleton)type Dir = "up" | "down"
Intersectiontype Both = Named & Aged
Generischer Aliastype List<T> = {T}
Aus einem Modul exportierenexport type Point = { x: number, y: number }
Typ eines vorhandenen Wertstype Config = typeof(config)
Schlüssel eines Tabellentypstype K = keyof<Point>

Tabellenformen & Methoden

Objekte beschreiben - und das self, das mit Doppelpunkt-Aufrufen kommt.

OperationSyntax
Inline-Formlocal p: { x: number, y: number } = { x = 0, y = 0 }
Benannte Formtype Point = { x: number, y: number }
Optionale Eigenschafttype User = { name: string, age: number? }
Form + Indexertype Bag = { count: number, [string]: any }
Form erweiterntype Admin = User & { level: number }
Methode (Doppelpunkt-Kurzform)function Point.move(self: Point, dx: number) end
Methode in einem Typtype Point = { move: (self: Point, dx: number) -> () }
Konstruktor-Musterfunction Point.new(x: number): Point end
Eingefrorene Konstanten (enum-artig)local Color = table.freeze({ Red = 1, Blue = 2 })

Generics

Eine Funktion oder ein Typ für viele Wertetypen.

OperationSyntax
Generische Funktionfunction id<T>(x: T): T return x end
Zwei Typparameterfunction pair<A, B>(a: A, b: B): (A, B) end
Generisch über ein Arrayfunction first<T>(xs: {T}): T? return xs[1] end
Generischer Typaliastype Stack<T> = { items: {T} }
Alias instanziierenlocal s: Stack<string> = { items = {} }
Generische map-Funktionfunction map<T, U>(xs: {T}, f: (T) -> U): {U} end
Generisches Pack (variadisch)function call<T...>(f: () -> T...): T... end

Narrowing, Casts & Guards

Den Typprüfer davon überzeugen, dass ein Wert das ist, was du weißt.

OperationSyntax
Typumwandlung (Cast)local n = value :: number
Cast über anylocal n = (value :: any) :: number
Mit typeof einengenif typeof(x) == "string" then -- x is string end
Optional einengenif name then print(#name) end
Früher Return bei nilif not name then return end
Literal-Union einengenif dir == "up" then end
Laufzeitprüfungassert(typeof(id) == "number", "id must be a number")
Nicht-nil sichern und nutzenlocal item = assert(find(id), "missing item")

Operatoren & Syntax, die Lua fehlen

Die alltäglichen Annehmlichkeiten - hier hört Luau-Code auf, wie Lua auszusehen.

OperationSyntax
Addieren und zuweisenhp += 10
Subtrahieren / multiplizieren / dividierenhp -= 5, dmg *= 2, dmg /= 2
Ganzzahldivision und zuweisenn //= 2
Modulo / Potenz und zuweisenn %= 3, n ^= 2
Verketten und zuweisenmsg ..= "!"
Ganzzahldivisionlocal half = 7 // 2 -- 3
String-InterpolationHello, {name}! You have {n} items. (in Backticks setzen)
Ausdruck interpolierenTotal: {price * qty} (in Backticks setzen)
Schleife fortsetzenfor _, v in xs do if v < 0 then continue end end
if-then-else-Ausdrucklocal label = if hp > 0 then "alive" else "dead"
Verketteter else-if-Ausdrucklocal t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero"
Binär- / getrennte Zahlenliterale0b1010, 1_000_000

Bibliotheks-Extras & Lua-Unterschiede

Funktionen, die Luau der Standardbibliothek hinzufügt, und Lua-Features, die es entfernt.

PunktDetail
Wert in einem Array findentable.find(xs, 42) -- Index oder nil
Flache Kopielocal copy = table.clone(t)
Unveränderlich machen / prüfentable.freeze(t), table.isfrozen(t)
Array vorbelegentable.create(10, 0)
Clamp / round / signmath.clamp(x, 0, 1), math.round(x), math.sign(x)
Bit-Operationenbit32.band(a, b), bit32.lshift(a, 1)
Aus Sandboxing-Gründen entferntio, package, loadstring, loadfile, dofile
Veraltet, aber vorhandengetfenv, setfenv (deaktivieren Optimierungen)
Nicht in Luaugoto / Labels (Luau basiert auf Lua 5.1)
stdin auf Coddy lesenio.read() funktioniert hier - Coddy stellt es über Luau bereit
Dateiendungmain.luau (.lua geht auch)
Nur Roblox, nicht Kern-Luaugame, workspace, Instance.new, task.wait

Luau ist Lua 5.1 plus graduelles Typsystem - die Sprache, die Roblox entwickelt und als Open Source freigegeben hat. Dieses Cheatsheet deckt das ab, was *nicht* einfaches Lua ist: Typannotationen, typisierte Tabellen, Unions und Literaltypen, Generics, Typumwandlungen und den Syntax-Zucker von Luau (+=, String-Interpolation, continue, if-then-else-Ausdrücke). Für alles, was beide Sprachen teilen - Tabellen, Metatabellen, Coroutinen, die String-Bibliothek - halte das Lua-Cheatsheet daneben offen.

Alles hier ist Standard-Luau, ausführbar mit dem luau-CLI und prüfbar mit luau-analyze. Kopiere, was du brauchst, oder probiere es live im Luau-Playground - ohne Installation. Neu beim Typsystem? Coddys kostenloser interaktiver Luau-Kurs baut es Lektion für Lektion auf.

FAQ zum Luau-Cheatsheet

Ist dieses Luau-Cheatsheet kostenlos?
Ja. Dieses Luau-Cheatsheet ist völlig kostenlos und ohne Anmeldung nutzbar. Setz ein Lesezeichen für das nächste Mal, wenn du die Syntax einer Union, eines Generics oder einer typisierten Tabelle brauchst.
Hat Luau einen +=-Operator?
Ja. Anders als reines Lua unterstützt Luau zusammengesetzte Zuweisungen: +=, -=, *=, /=, //=, %=, ^= und ..= für String-Verkettung. hp += 10 ist also gültiges Luau (und gültiger Roblox-Code), während man in Lua 5.1 hp = hp + 10 schreiben muss. Beachte: ++ und -- gibt es in Luau nicht.
Was ist der Unterschied zwischen Lua und Luau?
Luau ist eine Obermenge von Lua 5.1 mit graduellem Typsystem. Zusätzlich zu Typen bringt es String-Interpolation mit Backticks, zusammengesetzte Zuweisungsoperatoren, continue, if-then-else-Ausdrücke, Ganzzahldivision //, generalisierte Iteration (for i, v in t do) und Funktionen wie table.find, table.clone und table.freeze. Aus Sandboxing-Gründen fehlen loadstring, loadfile, dofile sowie die Bibliotheken io und package; goto gibt es nicht, weil Luau auf 5.1 basiert. Normaler Lua-Code läuft meist unverändert als Luau.
Wie schalte ich die Typprüfung in Luau ein?
Setze einen Modus-Kommentar in die erste Zeile: --!strict prüft alles und leitet aggressiv ab, --!nonstrict (Standard) prüft nur Annotiertes, --!nocheck schaltet die Prüfung aus. Außerhalb des Editors prüfst du mit luau-analyze main.luau ohne Ausführung und führst mit luau main.luau aus.
Schreibt man in Luau interface wie in TypeScript?
Nein - Luau hat kein interface-Schlüsselwort. Objektformen schreibt man als Tabellentypen und benennt sie mit type: type User = { name: string, age: number? }. Kombiniere Formen mit & statt extends, und nutze export type, um sie anderen Modulen bereitzustellen.
Ist dieses Cheatsheet dasselbe wie Roblox-Scripting?
Alles hier ist Kern-Luau - die Sprache - gilt also für Roblox-Skripte genauso wie für eigenständiges Luau. Was *nicht* hier steht, ist die Roblox-Engine-API (game, workspace, Instance.new, Services, Events): eine Bibliothek auf der Sprache, dokumentiert von Roblox, nicht von Luau.
Wo kann ich diese Luau-Snippets ausführen?
Im Luau-Playground - er führt den echten luau-Interpreter im Browser aus, mit stdin-Unterstützung. Du kannst also jede Zeile dieser Seite einfügen und auf Ausführen drücken. Für strukturierte Praxis behandelt der interaktive Luau-Kurs dasselbe Material mit Übungen, Projekten und Zertifikat.
Coddy programming languages illustration

Lerne Luau mit Coddy

LOS GEHT'S