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?
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.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.