Menu
Coddy logo textTech

Luau Cheat Sheet: ściąga z Luau

Tryby sprawdzania typów

Komentarz w pierwszej linii pliku decyduje, jak ściśle Luau go sprawdza.

TrybSkładnia
Bez sprawdzania typów--!nocheck
Domyślny: sprawdza to, co ma adnotacje--!nonstrict
Ścisły: wnioskuje i sprawdza wszystko--!strict
Uruchomienie plikuluau main.luau
Sprawdzenie typów bez uruchamianialuau-analyze main.luau
Wyłączenie jednego ostrzeżenia lintera--!nolint UnknownGlobal

Podstawowe typy

Typy proste i sposób dodawania adnotacji do zmiennej.

OperacjaSkładnia
Liczbalocal age: number = 25
Łańcuchlocal name: string = "Ada"
Wartość logicznalocal ok: boolean = true
Opcjonalny (może być nil)local nick: string? = nil
Any (wyłączenie sprawdzania)local x: any = f()
Unknown (bezpieczniejszy any)local x: unknown = f()
Never (zawsze rzuca błąd)function fail(): never error("boom") end
Nillocal n: nil = nil
Korutyna / buforlocal co: thread, local b: buffer
Wnioskowany: adnotacja niepotrzebnalocal hp = 100 -- number

Typowane tabele: tablice i mapy

Tabele to nadal tabele Lua: typ mówi, co jest w środku.

OperacjaSkładnia
Tablica liczblocal xs: {number} = {1, 2, 3}
Tablica łańcuchówlocal names: {string} = {}
Mapa (klucze tekstowe)local ages: {[string]: number} = {}
Mapa (dowolny typ klucza)local seen: {[Player]: boolean} = {}
Tablica zagnieżdżonalocal grid: {{number}} = {}
Tablica obiektów o danym kształcielocal items: {{id: number}} = {}
Tablica tylko do odczytulocal t = table.freeze({1, 2, 3})
Iteracja (uogólniona, tylko Luau)for i, v in xs do print(i, v) end
Iteracja po kluczach i wartościachfor k, v in pairs(ages) do end

Funkcje

Dodaj adnotacje do parametrów i typu zwracanego; -> () oznacza, że funkcja nic nie zwraca.

OperacjaSkładnia
Typowane parametry i wynikfunction add(a: number, b: number): number
Nic nie zwracafunction log(msg: string): () end
Wiele wartości zwracanychfunction split(s: string): (string, string)
Parametr opcjonalnyfunction greet(name: string?) end
Wartość domyślnafunction greet(name: string?) name = name or "friend" end
Zmienna liczba argumentówfunction sum(...: number): number end
Funkcja anonimowalocal f = function(x: number): number return x * 2 end
Typ funkcjitype Adder = (number, number) -> number
Parametr callbackfunction each(f: (number) -> ()) end

Aliasy typów, unie i literały

Nazwij typ raz i używaj go wszędzie.

OperacjaSkładnia
Alias typu prostegotype Health = number
Uniatype Id = number | string
Opcjonalny to unia z niltype Maybe = string | nil -- same as string?
Typ literałowy (singleton)type Dir = "up" | "down"
Przecięcietype Both = Named & Aged
Alias generycznytype List<T> = {T}
Eksport z modułuexport type Point = { x: number, y: number }
Typ istniejącej wartościtype Config = typeof(config)
Klucze typu tabelitype K = keyof<Point>

Kształty tabel i metody

Opisywanie obiektów i self, które pojawia się przy wywołaniach z dwukropkiem.

OperacjaSkładnia
Kształt w liniilocal p: { x: number, y: number } = { x = 0, y = 0 }
Nazwany kształttype Point = { x: number, y: number }
Właściwość opcjonalnatype User = { name: string, age: number? }
Kształt z indeksatoremtype Bag = { count: number, [string]: any }
Rozszerzenie kształtutype Admin = User & { level: number }
Metoda (skrót z dwukropkiem)function Point.move(self: Point, dx: number) end
Metoda w typietype Point = { move: (self: Point, dx: number) -> () }
Wzorzec konstruktorafunction Point.new(x: number): Point end
Zamrożone stałe (jak enum)local Color = table.freeze({ Red = 1, Blue = 2 })

Generyki

Jedna funkcja lub typ, które działają z wieloma typami wartości.

OperacjaSkładnia
Funkcja generycznafunction id<T>(x: T): T return x end
Dwa parametry typufunction pair<A, B>(a: A, b: B): (A, B) end
Funkcja generyczna dla tablicyfunction first<T>(xs: {T}): T? return xs[1] end
Generyczny alias typutype Stack<T> = { items: {T} }
Konkretyzacja aliasulocal s: Stack<string> = { items = {} }
Generyczna funkcja mapfunction map<T, U>(xs: {T}, f: (T) -> U): {U} end
Generyczny pakiet (zmienna liczba)function call<T...>(f: () -> T...): T... end

Zawężanie, asercje i strażnicy

Przekonywanie systemu typów, że wartość jest tym, czym wiesz, że jest.

OperacjaSkładnia
Asercja typu (rzutowanie)local n = value :: number
Asercja przez anylocal n = (value :: any) :: number
Zawężenie przez typeofif typeof(x) == "string" then -- x to string end
Zawężenie typu opcjonalnegoif name then print(#name) end
Wczesny powrót przy nilif not name then return end
Zawężenie unii literałówif dir == "up" then end
Sprawdzenie w czasie działania i błąd typuassert(typeof(id) == "number", "id must be a number")
Asercja, że nie nil, a potem użycielocal item = assert(find(id), "missing item")

Operatory i składnia, których nie ma w Lua

Codzienne ułatwienia: to tutaj kod Luau przestaje wyglądać jak Lua.

OperacjaSkładnia
Dodanie i przypisaniehp += 10
Odejmowanie / mnożenie / dzieleniehp -= 5, dmg *= 2, dmg /= 2
Dzielenie całkowite i przypisanien //= 2
Modulo / potęga i przypisanien %= 3, n ^= 2
Łączenie i przypisaniemsg ..= "!"
Dzielenie całkowitelocal half = 7 // 2 -- 3
Interpolacja łańcuchówHello, {name}! You have {n} items. (w odwrotnych apostrofach)
Interpolacja wyrażeniaTotal: {price * qty} (w odwrotnych apostrofach)
Continue w pętlifor _, v in xs do if v < 0 then continue end end
Wyrażenie if-then-elselocal label = if hp > 0 then "alive" else "dead"
Łańcuchowe wyrażenie else-iflocal t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero"
Literały binarne / z separatorami0b1010, 1_000_000

Dodatki w bibliotekach i różnice względem Lua

Funkcje biblioteki standardowej dodane w Luau i funkcje Lua, które zostały usunięte.

ElementSzczegóły
Wyszukanie wartości w tablicytable.find(xs, 42) -- indeks lub nil
Płytka kopialocal copy = table.clone(t)
Zamrożenie / sprawdzenietable.freeze(t), table.isfrozen(t)
Prealokacja tablicytable.create(10, 0)
Ograniczenie / zaokrąglenie / znakmath.clamp(x, 0, 1), math.round(x), math.sign(x)
Operacje bitowebit32.band(a, b), bit32.lshift(a, 1)
Usunięte ze względu na sandboxingio, package, loadstring, loadfile, dofile
Przestarzałe, ale wciąż dostępnegetfenv, setfenv (wyłączają optymalizacje)
Brak w Luaugoto / etykiety (Luau bazuje na Lua 5.1)
Odczyt stdin w Coddyio.read() działa tutaj: Coddy przywraca je na bazie Luau
Rozszerzenie plikumain.luau (.lua też działa)
Tylko Roblox, nie rdzeń Luaugame, workspace, Instance.new, task.wait

Luau to Lua 5.1 z dodanym stopniowym systemem typów: język stworzony przez Roblox i udostępniony jako open source. Ten Luau cheat sheet obejmuje to, czego *nie ma* w zwykłej Lua: adnotacje typów, typowane tabele, unie i typy literałowe, generyki, asercje typów oraz lukier składniowy, który dodaje Luau (+=, interpolacja łańcuchów, continue, wyrażenia if-then-else). Do wszystkiego, co oba języki mają wspólne (tabele, metatabele, korutyny, biblioteka string), trzymaj obok otwartą ściągę z Lua.

Każdy fragment tutaj to standardowe Luau, które uruchomisz przez CLI luau i sprawdzisz pod kątem typów przez luau-analyze. Skopiuj to, czego potrzebujesz, albo wypróbuj dowolny fragment w edytorze online Luau, bez instalacji. Uczysz się systemu typów od zera? Darmowy interaktywny kurs Luau w Coddy buduje go lekcja po lekcji.

Luau cheat sheet: najczęstsze pytania

Czy ten Luau cheat sheet jest darmowy?
Tak. Ta ściąga z Luau jest całkowicie darmowa i nie wymaga rejestracji. Dodaj ją do zakładek na następny raz, gdy potrzebujesz składni unii, generyka albo typowanej tabeli.
Czy Luau ma operator +=?
Tak. W przeciwieństwie do zwykłej Lua, Luau obsługuje przypisanie złożone: +=, -=, *=, /=, //=, %=, ^= oraz ..= do łączenia łańcuchów. Zatem hp += 10 to poprawne Luau (i poprawny kod skryptu Roblox), a w Lua 5.1 trzeba napisać hp = hp + 10. Pamiętaj, że w Luau nie ma ++ ani --.
Czym różni się Lua od Luau?
Luau to nadzbiór Lua 5.1 ze stopniowym systemem typów. Oprócz typów dodaje interpolację łańcuchów w odwrotnych apostrofach, operatory przypisania złożonego, continue, wyrażenia if-then-else, dzielenie całkowite //, uogólnioną iterację (for i, v in t do) oraz funkcje biblioteczne, takie jak table.find, table.clone i table.freeze. Ze względu na sandboxing usuwa loadstring, loadfile, dofile oraz biblioteki io i package, a goto nie ma, bo bazuje na 5.1. Większość zwykłego kodu Lua działa w Luau bez zmian.
Jak włączyć sprawdzanie typów w Luau?
Umieść komentarz z trybem w pierwszej linii pliku: --!strict sprawdza wszystko i agresywnie wnioskuje typy, --!nonstrict (domyślny) sprawdza tylko to, co ma adnotacje, a --!nocheck wyłącza sprawdzanie. Poza edytorem uruchom luau-analyze main.luau, aby sprawdzić typy bez wykonywania, i luau main.luau, aby uruchomić.
Czy w Luau piszę interface jak w TypeScripcie?
Nie. Luau nie ma słowa kluczowego interface. Kształty obiektów zapisuje się jako typy tabel i nadaje im nazwę przez type: type User = { name: string, age: number? }. Kształty łączysz przez & zamiast extends, a export type udostępnia typ innym modułom.
Czy ta ściąga to to samo co skryptowanie w Roblox?
Wszystko tutaj to rdzeń Luau, czyli sam język, więc dotyczy zarówno skryptów Roblox, jak i samodzielnego Luau. *Nie ma* tu API silnika Roblox (game, workspace, Instance.new, usługi, zdarzenia), które jest biblioteką nadbudowaną na języku i dokumentuje je Roblox, a nie Luau.
Gdzie mogę uruchomić te fragmenty Luau?
W edytorze online Luau: uruchamia on prawdziwy interpreter luau w przeglądarce z obsługą stdin, więc możesz wkleić dowolny wiersz z tej strony i nacisnąć Run. Do systematycznej nauki służy interaktywny kurs Luau z tym samym materiałem, ćwiczeniami, projektami i certyfikatem.
Ilustracja języków programowania w Coddy

Naucz się języka Luau z Coddy

ZACZNIJ