Luau Kopya Kağıdı
Tip denetimi modları
Dosyanın ilk satırındaki bir yorum, Luau'nun ne kadar sıkı denetleyeceğini belirler.
| Mod | Sözdizimi |
|---|---|
| Tip denetimi yok | --!nocheck |
| Varsayılan: yalnızca işaretlenmiş olanı denetler | --!nonstrict |
| Strict: her şeyi çıkarsar ve denetler | --!strict |
| Bir dosyayı çalıştır | luau main.luau |
| Çalıştırmadan tip denetimi | luau-analyze main.luau |
| Bir lint uyarısını kapat | --!nolint UnknownGlobal |
Temel tipler
İlkel tipler ve bir değişkeni nasıl işaretleyeceğin.
| İşlem | Sözdizimi |
|---|---|
| Sayı | local age: number = 25 |
| Dize | local name: string = "Ada" |
| Boole | local ok: boolean = true |
| İsteğe bağlı (nil olabilir) | local nick: string? = nil |
| Any (denetim dışı) | local x: any = f() |
| Unknown (daha güvenli any) | local x: unknown = f() |
| Never (her zaman hata verir) | function fail(): never error("boom") end |
| Nil | local n: nil = nil |
| Coroutine / buffer | local co: thread, local b: buffer |
| Çıkarsanan - açıklama gerekmez | local hp = 100 -- number |
Tipli tablolar: diziler ve haritalar
Hâlâ Lua tabloları; tip yalnızca içinde ne olduğunu söyler.
| İşlem | Sözdizimi |
|---|---|
| Sayı dizisi | local xs: {number} = {1, 2, 3} |
| Dize dizisi | local names: {string} = {} |
| Harita (dize anahtar) | local ages: {[string]: number} = {} |
| Harita (herhangi bir anahtar tipi) | local seen: {[Player]: boolean} = {} |
| İç içe dizi | local grid: {{number}} = {} |
| Şekil dizisi | local items: {{id: number}} = {} |
| Salt okunur dizi | local t = table.freeze({1, 2, 3}) |
| Döngü (genelleştirilmiş, yalnızca Luau) | for i, v in xs do print(i, v) end |
| Anahtar ve değerleri dolaş | for k, v in pairs(ages) do end |
Fonksiyonlar
Parametreleri ve dönüş tipini işaretle; -> () hiçbir şey döndürmez demektir.
| İşlem | Sözdizimi |
|---|---|
| Tipli parametre + dönüş | function add(a: number, b: number): number |
| Hiçbir şey döndürmez | function log(msg: string): () end |
| Çoklu dönüş | function split(s: string): (string, string) |
| İsteğe bağlı parametre | function greet(name: string?) end |
| Varsayılan değer | function greet(name: string?) name = name or "friend" end |
| Değişken sayıda argüman | function sum(...: number): number end |
| Anonim fonksiyon | local f = function(x: number): number return x * 2 end |
| Fonksiyon tipi | type Adder = (number, number) -> number |
| Callback parametresi | function each(f: (number) -> ()) end |
Tip takma adları, birleşimler ve literaller
Bir tipi bir kez adlandır, her yerde kullan.
| İşlem | Sözdizimi |
|---|---|
| İlkel tipe takma ad | type Health = number |
| Birleşim | type Id = number | string |
| İsteğe bağlı = nil ile birleşim | type Maybe = string | nil -- same as string? |
| Literal (tekil) tip | type Dir = "up" | "down" |
| Kesişim | type Both = Named & Aged |
| Generic takma ad | type List<T> = {T} |
| Modülden dışa aktar | export type Point = { x: number, y: number } |
| Var olan bir değerin tipi | type Config = typeof(config) |
| Tablo tipinin anahtarları | type K = keyof<Point> |
Tablo şekilleri ve metotlar
Nesneleri tanımlamak ve iki nokta üst üste çağrılarla gelen self.
| İşlem | Sözdizimi |
|---|---|
| Satır içi şekil | local p: { x: number, y: number } = { x = 0, y = 0 } |
| Adlandırılmış şekil | type Point = { x: number, y: number } |
| İsteğe bağlı özellik | type User = { name: string, age: number? } |
| Şekil + indeksleyici | type Bag = { count: number, [string]: any } |
| Şekli genişlet | type Admin = User & { level: number } |
| Metot (iki nokta kısayolu) | function Point.move(self: Point, dx: number) end |
| Tip içinde metot | type Point = { move: (self: Point, dx: number) -> () } |
| Yapıcı kalıbı | function Point.new(x: number): Point end |
| Dondurulmuş sabitler (enum benzeri) | local Color = table.freeze({ Red = 1, Blue = 2 }) |
Generic'ler
Birçok değer tipiyle çalışan tek bir fonksiyon ya da tip.
| İşlem | Sözdizimi |
|---|---|
| Generic fonksiyon | function id<T>(x: T): T return x end |
| İki tip parametresi | function pair<A, B>(a: A, b: B): (A, B) end |
| Dizi üzerinde generic | function first<T>(xs: {T}): T? return xs[1] end |
| Generic tip takma adı | type Stack<T> = { items: {T} } |
| Takma adı örnekle | local s: Stack<string> = { items = {} } |
| Generic map fonksiyonu | function map<T, U>(xs: {T}, f: (T) -> U): {U} end |
| Generic paket (variadic) | function call<T...>(f: () -> T...): T... end |
Daraltma, dönüşüm ve guard'lar
Tip denetleyicisini, bir değerin bildiğin şey olduğuna ikna etmek.
| İşlem | Sözdizimi |
|---|---|
| Tip dönüşümü (cast) | local n = value :: number |
| any üzerinden dönüşüm | local n = (value :: any) :: number |
| typeof ile daralt | if typeof(x) == "string" then -- x is string end |
| İsteğe bağlıyı daralt | if name then print(#name) end |
| nil ise erken dön | if not name then return end |
| Literal birleşimi daralt | if dir == "up" then end |
| Çalışma zamanı kontrolü | assert(typeof(id) == "number", "id must be a number") |
| nil olmadığını doğrula ve kullan | local item = assert(find(id), "missing item") |
Lua'da olmayan operatörler ve sözdizimi
Günlük kullanım kolaylıkları - Luau kodunun Lua'ya benzemeyi bıraktığı yer.
| İşlem | Sözdizimi |
|---|---|
| Ekle ve ata | hp += 10 |
| Çıkar / çarp / böl | hp -= 5, dmg *= 2, dmg /= 2 |
| Tam bölme ve ata | n //= 2 |
| Mod / kuvvet ve ata | n %= 3, n ^= 2 |
| Birleştir ve ata | msg ..= "!" |
| Tam bölme | local half = 7 // 2 -- 3 |
| Dize interpolasyonu | Hello, {name}! You have {n} items. (ters tırnak içine al) |
| Bir ifadeyi araya koy | Total: {price * qty} (ters tırnak içine al) |
| Döngüde devam et | for _, v in xs do if v < 0 then continue end end |
| if-then-else ifadesi | local label = if hp > 0 then "alive" else "dead" |
| Zincirlenmiş else-if ifadesi | local t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero" |
| İkilik / ayraçlı sayı literalleri | 0b1010, 1_000_000 |
Kütüphane ekleri ve Lua farkları
Luau'nun eklediği standart kütüphane fonksiyonları ve kaldırdığı Lua özellikleri.
| Öğe | Ayrıntı |
|---|---|
| Dizide bir değer bul | table.find(xs, 42) -- indeks ya da nil |
| Yüzeysel kopya | local copy = table.clone(t) |
| Değişmez yap / kontrol et | table.freeze(t), table.isfrozen(t) |
| Diziyi önceden ayır | table.create(10, 0) |
| Clamp / round / sign | math.clamp(x, 0, 1), math.round(x), math.sign(x) |
| Bit işlemleri | bit32.band(a, b), bit32.lshift(a, 1) |
| Yalıtım için kaldırıldı | io, package, loadstring, loadfile, dofile |
| Kullanımdan kalkmış ama mevcut | getfenv, setfenv (optimizasyonları devre dışı bırakır) |
| Luau'da yok | goto / etiketler (Luau, Lua 5.1 temellidir) |
| Coddy'de stdin okuma | io.read() burada çalışır - Coddy onu Luau üzerine geri ekler |
| Dosya uzantısı | main.luau (.lua da çalışır) |
| Yalnızca Roblox, çekirdek Luau değil | game, workspace, Instance.new, task.wait |
Luau, Lua 5.1 artı kademeli bir tip sistemidir - Roblox'un geliştirip açık kaynak yaptığı dil. Bu kopya kağıdı düz Lua *olmayan* kısmı kapsar: tip açıklamaları, tipli tablolar, birleşim ve literal tipler, generic'ler, tip dönüşümleri ve Luau'nun eklediği sözdizimi kolaylıkları (+=, dize interpolasyonu, continue, if-then-else ifadeleri). İki dilin paylaştığı her şey için - tablolar, metatablolar, coroutine'ler, string kütüphanesi - Lua kopya kağıdını yanında açık tut.
Buradaki her parça standart Luau'dur; luau CLI'si ile çalışır ve luau-analyze ile tip denetimi yapılabilir. İhtiyacın olanı kopyala ya da hepsini Luau playground içinde canlı dene - kurulum yok. Tip sistemine sıfırdan mı başlıyorsun? Coddy'nin ücretsiz etkileşimli Luau kursu ders ders kurar.
Luau kopya kağıdı SSS
Bu Luau kopya kağıdı ücretsiz mi?
Evet. Bu Luau kopya kağıdı tamamen ücretsiz ve kayıt gerektirmiyor. Bir birleşim, bir generic ya da tipli bir tablo sözdizimine ihtiyaç duyduğunda dönmek için yer imlerine ekle.
Luau'da += operatörü var mı?
+=, -=, *=, /=, //=, %=, ^= ve dize birleştirme için ..=. Yani hp += 10 geçerli Luau'dur (ve geçerli Roblox kodudur); Lua 5.1'de ise hp = hp + 10 yazmak zorundasın. Not: Luau'da ++ veya -- yoktur.Lua ile Luau arasındaki fark nedir?
continue, if-then-else ifadeleri, tam bölme //, genelleştirilmiş döngü (for i, v in t do) ve table.find, table.clone, table.freeze gibi fonksiyonlar ekler. Yalıtım için loadstring, loadfile, dofile ile io ve package kütüphanelerini kaldırır; 5.1 temelli olduğu için goto yoktur. Sıradan Lua kodunun çoğu değiştirilmeden Luau olarak çalışır.Luau'da tip denetimini nasıl açarım?
--!strict her şeyi denetler ve agresif çıkarım yapar, --!nonstrict (varsayılan) yalnızca işaretlediklerini denetler, --!nocheck denetimi kapatır. Editör dışında, çalıştırmadan denetlemek için luau-analyze main.luau, çalıştırmak için luau main.luau kullan.TypeScript'teki gibi Luau'da interface yazar mıyım?
interface anahtar kelimesi yok. Nesne şekilleri tablo tipi olarak yazılır ve type ile adlandırılır: type User = { name: string, age: number? }. Şekilleri extends yerine & ile birleştir ve başka modüllere açmak için export type kullan.Bu kopya kağıdı Roblox betik yazımıyla aynı mı?
game, workspace, Instance.new, servisler, olaylar); o, dilin üstündeki bir kütüphanedir ve Luau değil Roblox tarafından belgelenir. Roblox Game Scripting kursu bu API'yi, tarayıcında Roblox tarzı küçük bir oyunda çalışan script'lerle öğretir.Bu Luau parçalarını nerede çalıştırabilirim?
luau yorumlayıcısını, stdin desteğiyle çalıştırır; bu sayfadaki herhangi bir satırı yapıştırıp Çalıştır'a basabilirsin. Yapılandırılmış pratik için etkileşimli Luau kursu aynı konuları alıştırmalar, projeler ve sertifikayla ele alır.