Cheat Sheet Luau
Mode pemeriksaan tipe
Komentar di baris pertama file menentukan seberapa ketat Luau memeriksanya.
| Mode | Sintaks |
|---|---|
| Tanpa pemeriksaan tipe | --!nocheck |
| Default: memeriksa yang diberi anotasi | --!nonstrict |
| Strict: menyimpulkan dan memeriksa semuanya | --!strict |
| Menjalankan file | luau main.luau |
| Memeriksa tipe tanpa menjalankan | luau-analyze main.luau |
| Mematikan satu peringatan lint | --!nolint UnknownGlobal |
Tipe dasar
Tipe primitif dan cara memberi anotasi pada variabel.
| Operasi | Sintaks |
|---|---|
| Number | local age: number = 25 |
| String | local name: string = "Ada" |
| Boolean | local ok: boolean = true |
| Opsional (bisa nil) | local nick: string? = nil |
| Any (keluar dari pemeriksaan) | local x: any = f() |
| Unknown (any yang lebih aman) | local x: unknown = f() |
| Never (selalu melempar error) | function fail(): never error("boom") end |
| Nil | local n: nil = nil |
| Coroutine / buffer | local co: thread, local b: buffer |
| Disimpulkan: tidak perlu anotasi | local hp = 100 -- number |
Table bertipe: array & map
Table tetaplah table Lua; tipenya menyatakan apa isinya.
| Operasi | Sintaks |
|---|---|
| Array berisi angka | local xs: {number} = {1, 2, 3} |
| Array berisi string | local names: {string} = {} |
| Map (key string) | local ages: {[string]: number} = {} |
| Map (key bertipe apa saja) | local seen: {[Player]: boolean} = {} |
| Array bersarang | local grid: {{number}} = {} |
| Array berisi shape | local items: {{id: number}} = {} |
| Array read-only | local t = table.freeze({1, 2, 3}) |
| Iterasi (generalized, khusus Luau) | for i, v in xs do print(i, v) end |
| Iterasi key dan value | for k, v in pairs(ages) do end |
Fungsi
Beri anotasi pada parameter dan tipe kembalian; -> () berarti tidak mengembalikan apa pun.
| Operasi | Sintaks |
|---|---|
| Parameter bertipe + kembalian | function add(a: number, b: number): number |
| Tidak mengembalikan apa pun | function log(msg: string): () end |
| Beberapa nilai kembalian | function split(s: string): (string, string) |
| Parameter opsional | function greet(name: string?) end |
| Nilai default | function greet(name: string?) name = name or "friend" end |
| Variadic | function sum(...: number): number end |
| Fungsi anonim | local f = function(x: number): number return x * 2 end |
| Tipe fungsi | type Adder = (number, number) -> number |
| Parameter callback | function each(f: (number) -> ()) end |
Type alias, union & literal
Beri nama sebuah tipe sekali, lalu pakai ulang di mana saja.
| Operasi | Sintaks |
|---|---|
| Alias untuk tipe primitif | type Health = number |
| Union | type Id = number | string |
| Opsional adalah union dengan nil | type Maybe = string | nil -- same as string? |
| Literal type (singleton) | type Dir = "up" | "down" |
| Intersection | type Both = Named & Aged |
| Alias generic | type List<T> = {T} |
| Export dari module | export type Point = { x: number, y: number } |
| Tipe dari nilai yang sudah ada | type Config = typeof(config) |
| Key dari sebuah tipe table | type K = keyof<Point> |
Shape table & method
Menggambarkan object, serta self yang ikut dalam pemanggilan dengan titik dua.
| Operasi | Sintaks |
|---|---|
| Shape inline | local p: { x: number, y: number } = { x = 0, y = 0 } |
| Shape bernama | type Point = { x: number, y: number } |
| Property opsional | type User = { name: string, age: number? } |
| Shape + indexer | type Bag = { count: number, [string]: any } |
| Memperluas shape | type Admin = User & { level: number } |
| Method (singkatan titik dua) | function Point.move(self: Point, dx: number) end |
| Method di dalam tipe | type Point = { move: (self: Point, dx: number) -> () } |
| Pola constructor | function Point.new(x: number): Point end |
| Konstanta beku (mirip enum) | local Color = table.freeze({ Red = 1, Blue = 2 }) |
Generic
Satu fungsi atau tipe yang berlaku untuk banyak tipe nilai.
| Operasi | Sintaks |
|---|---|
| Fungsi generic | function id<T>(x: T): T return x end |
| Dua parameter tipe | function pair<A, B>(a: A, b: B): (A, B) end |
| Generic pada array | function first<T>(xs: {T}): T? return xs[1] end |
| Type alias generic | type Stack<T> = { items: {T} } |
| Membuat instance alias | local s: Stack<string> = { items = {} } |
| Fungsi map generic | function map<T, U>(xs: {T}, f: (T) -> U): {U} end |
| Generic pack (variadic) | function call<T...>(f: () -> T...): T... end |
Narrowing, assertion & guard
Meyakinkan type checker bahwa sebuah nilai memang seperti yang kamu ketahui.
| Operasi | Sintaks |
|---|---|
| Type assertion (cast) | local n = value :: number |
| Assertion lewat any | local n = (value :: any) :: number |
| Narrowing dengan typeof | if typeof(x) == "string" then -- x is string end |
| Narrowing nilai opsional | if name then print(#name) end |
| Return lebih awal saat nil | if not name then return end |
| Narrowing union literal | if dir == "up" then end |
| Pemeriksaan runtime + error tipe | assert(typeof(id) == "number", "id must be a number") |
| Memastikan tidak nil, lalu dipakai | local item = assert(find(id), "missing item") |
Operator & sintaks yang tidak ada di Lua
Tambahan kecil yang memudahkan sehari-hari; di sinilah kode Luau mulai terlihat berbeda dari Lua.
| Operasi | Sintaks |
|---|---|
| Tambah lalu assign | hp += 10 |
| Kurang / kali / bagi | hp -= 5, dmg *= 2, dmg /= 2 |
| Floor division lalu assign | n //= 2 |
| Modulo / pangkat lalu assign | n %= 3, n ^= 2 |
| Gabungkan string lalu assign | msg ..= "!" |
| Floor division | local half = 7 // 2 -- 3 |
| Interpolasi string | Hello, {name}! You have {n} items. (dibungkus backtick) |
| Menyisipkan ekspresi | Total: {price * qty} (dibungkus backtick) |
| Melanjutkan perulangan (continue) | for _, v in xs do if v < 0 then continue end end |
| Ekspresi if-then-else | local label = if hp > 0 then "alive" else "dead" |
| Ekspresi else-if berantai | local t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero" |
| Literal angka biner / dengan pemisah | 0b1010, 1_000_000 |
Tambahan library & perbedaan dengan Lua
Fungsi library standar yang ditambahkan Luau, dan fitur Lua yang dihapusnya.
| Item | Detail |
|---|---|
| Mencari nilai di array | table.find(xs, 42) -- index or nil |
| Salinan dangkal (shallow copy) | local copy = table.clone(t) |
| Membuat immutable / memeriksa | table.freeze(t), table.isfrozen(t) |
| Mengalokasikan array lebih dulu | table.create(10, 0) |
| Clamp / pembulatan / tanda | math.clamp(x, 0, 1), math.round(x), math.sign(x) |
| Operasi bitwise | bit32.band(a, b), bit32.lshift(a, 1) |
| Dihapus demi sandboxing | io, package, loadstring, loadfile, dofile |
| Usang tetapi masih ada | getfenv, setfenv (keduanya mematikan optimasi) |
| Tidak ada di Luau | goto / label (Luau berbasis Lua 5.1) |
| Membaca stdin di Coddy | io.read() bisa dipakai di sini, karena Coddy mengembalikannya di atas Luau |
| Ekstensi file | main.luau (.lua juga bisa) |
| Khusus Roblox, bukan Luau inti | game, workspace, Instance.new, task.wait |
Luau adalah Lua 5.1 ditambah sistem tipe bertahap (gradual), bahasa yang dibuat dan dijadikan open source oleh Roblox. Cheat sheet Luau ini membahas bagian yang *bukan* Lua biasa: anotasi tipe, table bertipe, union dan literal type, generic, type assertion, serta pemanis sintaks yang ditambahkan Luau (+=, interpolasi string, continue, ekspresi if-then-else). Untuk semua yang sama di kedua bahasa, seperti table, metatable, coroutine, dan library string, buka cheat sheet Lua di sebelah halaman ini.
Setiap potongan kode di sini adalah Luau standar, bisa dijalankan dengan CLI luau dan diperiksa tipenya dengan luau-analyze. Salin yang kamu butuhkan, atau coba langsung di playground Luau, tanpa perlu instalasi. Ingin mempelajari sistem tipenya dari nol? Kursus Luau interaktif gratis dari Coddy membangunnya pelajaran demi pelajaran.
FAQ cheat sheet Luau
Apakah cheat sheet Luau ini gratis?
Ya. Cheat sheet Luau ini sepenuhnya gratis dan tidak perlu daftar. Simpan di bookmark untuk saat kamu butuh sintaks union, generic, atau table bertipe.
Apakah Luau punya operator +=?
+=, -=, *=, /=, //=, %=, ^=, dan ..= untuk penggabungan string. Jadi hp += 10 adalah Luau yang valid (dan kode script Roblox yang valid), sedangkan di Lua 5.1 kamu harus menulis hp = hp + 10. Perlu diingat, tidak ada ++ atau -- di Luau.Apa perbedaan Lua dan Luau?
continue, ekspresi if-then-else, floor division //, iterasi generalized (for i, v in t do), dan fungsi library seperti table.find, table.clone, dan table.freeze. Demi sandboxing, Luau menghapus loadstring, loadfile, dofile, serta library io dan package, dan tidak punya goto karena berbasis 5.1. Sebagian besar kode Lua biasa berjalan tanpa perubahan sebagai Luau.Bagaimana cara mengaktifkan pemeriksaan tipe di Luau?
--!strict memeriksa semuanya dan menyimpulkan tipe secara agresif, --!nonstrict (default) hanya memeriksa yang kamu beri anotasi, dan --!nocheck mematikan pemeriksaan. Di luar editor, jalankan luau-analyze main.luau untuk memeriksa tipe tanpa menjalankan kode, dan luau main.luau untuk menjalankannya.Apakah saya menulis interface di Luau seperti di TypeScript?
interface. Bentuk object ditulis sebagai tipe table dan diberi nama dengan type: type User = { name: string, age: number? }. Gabungkan shape dengan & sebagai ganti extends, dan pakai export type agar bisa dipakai oleh module lain.Apakah cheat sheet ini sama dengan scripting Roblox?
game, workspace, Instance.new, service, event), yaitu library di atas bahasanya yang didokumentasikan oleh Roblox, bukan oleh Luau. Kursus Roblox Game Scripting mengajarkan API itu dengan script yang berjalan di game kecil bergaya Roblox di browsermu.Di mana saya bisa menjalankan potongan kode Luau ini?
luau sungguhan di browsermu, dengan dukungan stdin, jadi kamu bisa menempel baris mana pun dari halaman ini lalu menekan Jalankan. Untuk latihan yang terarah, kursus Luau interaktif membahas materi yang sama dengan latihan, proyek, dan sertifikat.