Menu
Coddy logo textTech

Luau Kopya Kağıdı

Tip denetimi modları

Dosyanın ilk satırındaki bir yorum, Luau'nun ne kadar sıkı denetleyeceğini belirler.

ModSö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ırluau main.luau
Çalıştırmadan tip denetimiluau-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.

İşlemSözdizimi
Sayılocal age: number = 25
Dizelocal name: string = "Ada"
Boolelocal 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
Nillocal n: nil = nil
Coroutine / bufferlocal co: thread, local b: buffer
Çıkarsanan - açıklama gerekmezlocal hp = 100 -- number

Tipli tablolar: diziler ve haritalar

Hâlâ Lua tabloları; tip yalnızca içinde ne olduğunu söyler.

İşlemSözdizimi
Sayı dizisilocal xs: {number} = {1, 2, 3}
Dize dizisilocal names: {string} = {}
Harita (dize anahtar)local ages: {[string]: number} = {}
Harita (herhangi bir anahtar tipi)local seen: {[Player]: boolean} = {}
İç içe dizilocal grid: {{number}} = {}
Şekil dizisilocal items: {{id: number}} = {}
Salt okunur dizilocal 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.

İşlemSözdizimi
Tipli parametre + dönüşfunction add(a: number, b: number): number
Hiçbir şey döndürmezfunction log(msg: string): () end
Çoklu dönüşfunction split(s: string): (string, string)
İsteğe bağlı parametrefunction greet(name: string?) end
Varsayılan değerfunction greet(name: string?) name = name or "friend" end
Değişken sayıda argümanfunction sum(...: number): number end
Anonim fonksiyonlocal f = function(x: number): number return x * 2 end
Fonksiyon tipitype Adder = (number, number) -> number
Callback parametresifunction each(f: (number) -> ()) end

Tip takma adları, birleşimler ve literaller

Bir tipi bir kez adlandır, her yerde kullan.

İşlemSözdizimi
İlkel tipe takma adtype Health = number
Birleşimtype Id = number | string
İsteğe bağlı = nil ile birleşimtype Maybe = string | nil -- same as string?
Literal (tekil) tiptype Dir = "up" | "down"
Kesişimtype Both = Named & Aged
Generic takma adtype List<T> = {T}
Modülden dışa aktarexport type Point = { x: number, y: number }
Var olan bir değerin tipitype 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.

İşlemSözdizimi
Satır içi şekillocal p: { x: number, y: number } = { x = 0, y = 0 }
Adlandırılmış şekiltype Point = { x: number, y: number }
İsteğe bağlı özelliktype User = { name: string, age: number? }
Şekil + indeksleyicitype Bag = { count: number, [string]: any }
Şekli genişlettype Admin = User & { level: number }
Metot (iki nokta kısayolu)function Point.move(self: Point, dx: number) end
Tip içinde metottype 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.

İşlemSözdizimi
Generic fonksiyonfunction id<T>(x: T): T return x end
İki tip parametresifunction pair<A, B>(a: A, b: B): (A, B) end
Dizi üzerinde genericfunction first<T>(xs: {T}): T? return xs[1] end
Generic tip takma adıtype Stack<T> = { items: {T} }
Takma adı örneklelocal s: Stack<string> = { items = {} }
Generic map fonksiyonufunction 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.

İşlemSözdizimi
Tip dönüşümü (cast)local n = value :: number
any üzerinden dönüşümlocal n = (value :: any) :: number
typeof ile daraltif typeof(x) == "string" then -- x is string end
İsteğe bağlıyı daraltif name then print(#name) end
nil ise erken dönif not name then return end
Literal birleşimi daraltif dir == "up" then end
Çalışma zamanı kontrolüassert(typeof(id) == "number", "id must be a number")
nil olmadığını doğrula ve kullanlocal 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.

İşlemSözdizimi
Ekle ve atahp += 10
Çıkar / çarp / bölhp -= 5, dmg *= 2, dmg /= 2
Tam bölme ve atan //= 2
Mod / kuvvet ve atan %= 3, n ^= 2
Birleştir ve atamsg ..= "!"
Tam bölmelocal half = 7 // 2 -- 3
Dize interpolasyonuHello, {name}! You have {n} items. (ters tırnak içine al)
Bir ifadeyi araya koyTotal: {price * qty} (ters tırnak içine al)
Döngüde devam etfor _, v in xs do if v < 0 then continue end end
if-then-else ifadesilocal label = if hp > 0 then "alive" else "dead"
Zincirlenmiş else-if ifadesilocal t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero"
İkilik / ayraçlı sayı literalleri0b1010, 1_000_000

Kütüphane ekleri ve Lua farkları

Luau'nun eklediği standart kütüphane fonksiyonları ve kaldırdığı Lua özellikleri.

ÖğeAyrıntı
Dizide bir değer bultable.find(xs, 42) -- indeks ya da nil
Yüzeysel kopyalocal copy = table.clone(t)
Değişmez yap / kontrol ettable.freeze(t), table.isfrozen(t)
Diziyi önceden ayırtable.create(10, 0)
Clamp / round / signmath.clamp(x, 0, 1), math.round(x), math.sign(x)
Bit işlemleribit32.band(a, b), bit32.lshift(a, 1)
Yalıtım için kaldırıldıio, package, loadstring, loadfile, dofile
Kullanımdan kalkmış ama mevcutgetfenv, setfenv (optimizasyonları devre dışı bırakır)
Luau'da yokgoto / etiketler (Luau, Lua 5.1 temellidir)
Coddy'de stdin okumaio.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ğilgame, 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ı?
Evet. Düz Lua'nın aksine Luau bileşik atamayı destekler: +=, -=, *=, /=, //=, %=, ^= 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?
Luau, kademeli tip sistemine sahip bir Lua 5.1 üst kümesidir. Tiplerin üstüne ters tırnakla dize interpolasyonu, bileşik atama operatörleri, 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?
Dosyanın ilk satırına bir mod yorumu koy: --!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?
Hayır - Luau'da 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ı?
Buradaki her şey çekirdek Luau - yani dil - dolayısıyla hem Roblox betikleri hem bağımsız Luau için geçerli. Burada *olmayan* şey Roblox motor API'si (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 playground içinde - tarayıcında gerçek 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.
Coddy programming languages illustration

Coddy ile Luau öğren

BAŞLA