Menu
CoddyTech

Cheat Sheet Luau

Mode pemeriksaan tipe

Komentar di baris pertama file menentukan seberapa ketat Luau memeriksanya.

ModeSintaks
Tanpa pemeriksaan tipe--!nocheck
Default: memeriksa yang diberi anotasi--!nonstrict
Strict: menyimpulkan dan memeriksa semuanya--!strict
Menjalankan fileluau main.luau
Memeriksa tipe tanpa menjalankanluau-analyze main.luau
Mematikan satu peringatan lint--!nolint UnknownGlobal

Tipe dasar

Tipe primitif dan cara memberi anotasi pada variabel.

OperasiSintaks
Numberlocal age: number = 25
Stringlocal name: string = "Ada"
Booleanlocal 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
Nillocal n: nil = nil
Coroutine / bufferlocal co: thread, local b: buffer
Disimpulkan: tidak perlu anotasilocal hp = 100 -- number

Table bertipe: array & map

Table tetaplah table Lua; tipenya menyatakan apa isinya.

OperasiSintaks
Array berisi angkalocal xs: {number} = {1, 2, 3}
Array berisi stringlocal names: {string} = {}
Map (key string)local ages: {[string]: number} = {}
Map (key bertipe apa saja)local seen: {[Player]: boolean} = {}
Array bersaranglocal grid: {{number}} = {}
Array berisi shapelocal items: {{id: number}} = {}
Array read-onlylocal t = table.freeze({1, 2, 3})
Iterasi (generalized, khusus Luau)for i, v in xs do print(i, v) end
Iterasi key dan valuefor k, v in pairs(ages) do end

Fungsi

Beri anotasi pada parameter dan tipe kembalian; -> () berarti tidak mengembalikan apa pun.

OperasiSintaks
Parameter bertipe + kembalianfunction add(a: number, b: number): number
Tidak mengembalikan apa punfunction log(msg: string): () end
Beberapa nilai kembalianfunction split(s: string): (string, string)
Parameter opsionalfunction greet(name: string?) end
Nilai defaultfunction greet(name: string?) name = name or "friend" end
Variadicfunction sum(...: number): number end
Fungsi anonimlocal f = function(x: number): number return x * 2 end
Tipe fungsitype Adder = (number, number) -> number
Parameter callbackfunction each(f: (number) -> ()) end

Type alias, union & literal

Beri nama sebuah tipe sekali, lalu pakai ulang di mana saja.

OperasiSintaks
Alias untuk tipe primitiftype Health = number
Uniontype Id = number | string
Opsional adalah union dengan niltype Maybe = string | nil -- same as string?
Literal type (singleton)type Dir = "up" | "down"
Intersectiontype Both = Named & Aged
Alias generictype List<T> = {T}
Export dari moduleexport type Point = { x: number, y: number }
Tipe dari nilai yang sudah adatype Config = typeof(config)
Key dari sebuah tipe tabletype K = keyof<Point>

Shape table & method

Menggambarkan object, serta self yang ikut dalam pemanggilan dengan titik dua.

OperasiSintaks
Shape inlinelocal p: { x: number, y: number } = { x = 0, y = 0 }
Shape bernamatype Point = { x: number, y: number }
Property opsionaltype User = { name: string, age: number? }
Shape + indexertype Bag = { count: number, [string]: any }
Memperluas shapetype Admin = User & { level: number }
Method (singkatan titik dua)function Point.move(self: Point, dx: number) end
Method di dalam tipetype Point = { move: (self: Point, dx: number) -> () }
Pola constructorfunction 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.

OperasiSintaks
Fungsi genericfunction id<T>(x: T): T return x end
Dua parameter tipefunction pair<A, B>(a: A, b: B): (A, B) end
Generic pada arrayfunction first<T>(xs: {T}): T? return xs[1] end
Type alias generictype Stack<T> = { items: {T} }
Membuat instance aliaslocal s: Stack<string> = { items = {} }
Fungsi map genericfunction 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.

OperasiSintaks
Type assertion (cast)local n = value :: number
Assertion lewat anylocal n = (value :: any) :: number
Narrowing dengan typeofif typeof(x) == "string" then -- x is string end
Narrowing nilai opsionalif name then print(#name) end
Return lebih awal saat nilif not name then return end
Narrowing union literalif dir == "up" then end
Pemeriksaan runtime + error tipeassert(typeof(id) == "number", "id must be a number")
Memastikan tidak nil, lalu dipakailocal 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.

OperasiSintaks
Tambah lalu assignhp += 10
Kurang / kali / bagihp -= 5, dmg *= 2, dmg /= 2
Floor division lalu assignn //= 2
Modulo / pangkat lalu assignn %= 3, n ^= 2
Gabungkan string lalu assignmsg ..= "!"
Floor divisionlocal half = 7 // 2 -- 3
Interpolasi stringHello, {name}! You have {n} items. (dibungkus backtick)
Menyisipkan ekspresiTotal: {price * qty} (dibungkus backtick)
Melanjutkan perulangan (continue)for _, v in xs do if v < 0 then continue end end
Ekspresi if-then-elselocal label = if hp > 0 then "alive" else "dead"
Ekspresi else-if berantailocal t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero"
Literal angka biner / dengan pemisah0b1010, 1_000_000

Tambahan library & perbedaan dengan Lua

Fungsi library standar yang ditambahkan Luau, dan fitur Lua yang dihapusnya.

ItemDetail
Mencari nilai di arraytable.find(xs, 42) -- index or nil
Salinan dangkal (shallow copy)local copy = table.clone(t)
Membuat immutable / memeriksatable.freeze(t), table.isfrozen(t)
Mengalokasikan array lebih dulutable.create(10, 0)
Clamp / pembulatan / tandamath.clamp(x, 0, 1), math.round(x), math.sign(x)
Operasi bitwisebit32.band(a, b), bit32.lshift(a, 1)
Dihapus demi sandboxingio, package, loadstring, loadfile, dofile
Usang tetapi masih adagetfenv, setfenv (keduanya mematikan optimasi)
Tidak ada di Luaugoto / label (Luau berbasis Lua 5.1)
Membaca stdin di Coddyio.read() bisa dipakai di sini, karena Coddy mengembalikannya di atas Luau
Ekstensi filemain.luau (.lua juga bisa)
Khusus Roblox, bukan Luau intigame, 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 +=?
Punya. Tidak seperti Lua biasa, Luau mendukung compound assignment: +=, -=, *=, /=, //=, %=, ^=, 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?
Luau adalah superset dari Lua 5.1 dengan sistem tipe bertahap. Selain tipe, Luau menambahkan interpolasi string dengan backtick, operator compound assignment, 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?
Tulis komentar mode di baris pertama file: --!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?
Tidak. Luau tidak punya kata kunci 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?
Semua yang ada di sini adalah Luau inti (bahasanya), jadi berlaku untuk script Roblox maupun Luau mandiri. Yang *tidak* ada di sini adalah API engine 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?
Di playground Luau: playground ini menjalankan interpreter 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.
Ilustrasi bahasa pemrograman di Coddy

Belajar Luau bersama Coddy

Mulai