Menu
Coddy logo textTech

Luau Cheat Sheet: דף עזר מהיר

מצבי בדיקת טיפוסים

הערה בשורה הראשונה של הקובץ קובעת עד כמה Luau בודקת אותו בקפדנות.

מצבתחביר
בלי בדיקת טיפוסים--!nocheck
ברירת מחדל: בדיקה של מה שמסומן--!nonstrict
קפדני: הסקה ובדיקה של הכול--!strict
הרצת קובץluau main.luau
בדיקת טיפוסים בלי הרצהluau-analyze main.luau
כיבוי אזהרת lint אחת--!nolint UnknownGlobal

טיפוסים בסיסיים

טיפוסים פרימיטיביים ואיך מסמנים טיפוס של משתנה.

פעולהתחביר
מספרlocal age: number = 25
מחרוזתlocal name: string = "Ada"
בוליאניlocal ok: boolean = true
אופציונלי (יכול להיות nil)local nick: string? = nil
Any (יציאה מהבדיקה)local x: any = f()
Unknown (any בטוח יותר)local x: unknown = f()
Never (תמיד זורק שגיאה)function fail(): never error("boom") end
Nillocal n: nil = nil
Coroutine / bufferlocal co: thread, local b: buffer
מוסק: אין צורך בסימוןlocal hp = 100 -- number

טבלאות עם טיפוסים: מערכים ו-maps

טבלאות הן עדיין טבלאות של Lua: הטיפוס אומר מה יש בתוכן.

פעולהתחביר
מערך של מספריםlocal xs: {number} = {1, 2, 3}
מערך של מחרוזותlocal names: {string} = {}
Map (מפתחות מחרוזת)local ages: {[string]: number} = {}
Map (כל טיפוס מפתח)local seen: {[Player]: boolean} = {}
מערך מקונןlocal grid: {{number}} = {}
מערך של מבניםlocal items: {{id: number}} = {}
מערך לקריאה בלבדlocal t = table.freeze({1, 2, 3})
מעבר על האיברים (כללי, רק ב-Luau)for i, v in xs do print(i, v) end
מעבר על מפתחות וערכיםfor k, v in pairs(ages) do end

פונקציות

סמנו את הפרמטרים ואת טיפוס ההחזרה; -> () פירושו שלא מוחזר כלום.

פעולהתחביר
פרמטרים עם טיפוס + החזרהfunction add(a: number, b: number): number
לא מחזירה כלוםfunction log(msg: string): () end
כמה ערכי החזרהfunction split(s: string): (string, string)
פרמטר אופציונליfunction greet(name: string?) end
ערך ברירת מחדלfunction greet(name: string?) name = name or "friend" end
מספר משתנה של ארגומנטיםfunction sum(...: number): number end
פונקציה אנונימיתlocal f = function(x: number): number return x * 2 end
טיפוס של פונקציהtype Adder = (number, number) -> number
פרמטר callbackfunction each(f: (number) -> ()) end

כינויי טיפוסים, unions וליטרלים

תנו שם לטיפוס פעם אחת, והשתמשו בו בכל מקום.

פעולהתחביר
כינוי לטיפוס פרימיטיביtype Health = number
Union (איחוד)type Id = number | string
אופציונלי הוא union עם niltype Maybe = string | nil -- same as string?
טיפוס ליטרל (singleton)type Dir = "up" | "down"
Intersection (חיתוך)type Both = Named & Aged
כינוי גנריtype List<T> = {T}
ייצוא ממודולexport type Point = { x: number, y: number }
הטיפוס של ערך קייםtype Config = typeof(config)
המפתחות של טיפוס טבלהtype K = keyof<Point>

מבני טבלאות ומתודות

תיאור אובייקטים, וה-self שמגיע עם קריאות בנקודתיים.

פעולהתחביר
מבנה בתוך השורהlocal p: { x: number, y: number } = { x = 0, y = 0 }
מבנה עם שםtype Point = { x: number, y: number }
מאפיין אופציונליtype User = { name: string, age: number? }
מבנה + indexertype Bag = { count: number, [string]: any }
הרחבת מבנהtype Admin = User & { level: number }
מתודה (קיצור בנקודתיים)function Point.move(self: Point, dx: number) end
מתודה בתוך טיפוסtype Point = { move: (self: Point, dx: number) -> () }
דפוס בנאיfunction Point.new(x: number): Point end
קבועים מוקפאים (בסגנון enum)local Color = table.freeze({ Red = 1, Blue = 2 })

Generics

פונקציה או טיפוס אחד שעובדים עם הרבה טיפוסי ערכים.

פעולהתחביר
פונקציה גנריתfunction id<T>(x: T): T return x end
שני פרמטרי טיפוסfunction pair<A, B>(a: A, b: B): (A, B) end
גנרית על מערךfunction first<T>(xs: {T}): T? return xs[1] end
כינוי טיפוס גנריtype Stack<T> = { items: {T} }
שימוש בכינוי עם טיפוסlocal s: Stack<string> = { items = {} }
פונקציית map גנריתfunction map<T, U>(xs: {T}, f: (T) -> U): {U} end
Generic pack (מספר משתנה)function call<T...>(f: () -> T...): T... end

צמצום טיפוסים, assertions ו-guards

לשכנע את בודק הטיפוסים שערך הוא מה שאתם יודעים שהוא.

פעולהתחביר
Type assertion (המרה)local n = value :: number
Assertion דרך anylocal n = (value :: any) :: number
צמצום עם typeofif typeof(x) == "string" then -- x הוא string end
צמצום של אופציונליif name then print(#name) end
יציאה מוקדמת על nilif not name then return end
צמצום union של ליטרליםif dir == "up" then end
בדיקה בזמן ריצה + שגיאת טיפוסassert(typeof(id) == "number", "id must be a number")
וידוא שאינו nil ואז שימושlocal item = assert(find(id), "missing item")

אופרטורים ותחביר שאין ב-Lua

התוספות היומיומיות שמקלות על החיים: כאן קוד Luau מפסיק להיראות כמו Lua.

פעולהתחביר
חיבור והשמהhp += 10
חיסור / כפל / חילוקhp -= 5, dmg *= 2, dmg /= 2
חילוק שלמים והשמהn //= 2
שארית / חזקה והשמהn %= 3, n ^= 2
שרשור והשמהmsg ..= "!"
חילוק שלמיםlocal half = 7 // 2 -- 3
שילוב משתנים במחרוזתHello, {name}! You have {n} items. (עטפו ב-backticks)
שילוב ביטוי במחרוזתTotal: {price * qty} (עטפו ב-backticks)
המשך לאיטרציה הבאהfor _, v in xs do if v < 0 then continue end end
ביטוי if-then-elselocal label = if hp > 0 then "alive" else "dead"
ביטוי else-if משורשרlocal t = if n > 0 then "pos" elseif n < 0 then "neg" else "zero"
ליטרלים בינאריים / עם מפרידים0b1010, 1_000_000

תוספות בספריות והבדלים מ-Lua

פונקציות בספרייה הסטנדרטית ש-Luau מוסיפה, והיכולות של Lua שהיא מסירה.

פריטפירוט
חיפוש ערך במערךtable.find(xs, 42) -- אינדקס או nil
העתקה רדודהlocal copy = table.clone(t)
הפיכה לבלתי ניתן לשינוי / בדיקהtable.freeze(t), table.isfrozen(t)
הקצאה מראש של מערךtable.create(10, 0)
הגבלה לטווח / עיגול / סימןmath.clamp(x, 0, 1), math.round(x), math.sign(x)
פעולות על ביטיםbit32.band(a, b), bit32.lshift(a, 1)
הוסרו לטובת sandboxingio, package, loadstring, loadfile, dofile
הוצאו משימוש אבל עדיין קיימותgetfenv, setfenv (הן מבטלות אופטימיזציות)
לא קיים ב-Luaugoto / תוויות (Luau מבוססת על Lua 5.1)
קריאה מ-stdin ב-Coddyio.read() עובד כאן: Coddy מחזירה אותו מעל Luau
סיומת קובץmain.luau (גם .lua עובד)
רק ב-Roblox, לא חלק מליבת Luaugame, workspace, Instance.new, task.wait

Luau היא Lua 5.1 בתוספת מערכת טיפוסים הדרגתית: השפה ש-Roblox יצרה ופתחה כקוד פתוח. ה-Luau cheat sheet הזה מכסה את החלקים ש*אינם* Lua רגילה: הערות טיפוס, טבלאות עם טיפוסים, unions וטיפוסי ליטרל, generics, type assertions, והקיצורים התחביריים ש-Luau מוסיפה (+=, שילוב משתנים במחרוזות, continue, ביטויי if-then-else). לכל מה ששתי השפות חולקות, טבלאות, metatables, coroutines וספריית string, השאירו את דף העזר של Lua פתוח לצד הדף הזה.

כל קטע קוד כאן הוא Luau סטנדרטי, שאפשר להריץ עם ה-CLI של luau ולבדוק את הטיפוסים שלו עם luau-analyze. העתיקו את מה שצריך, או נסו כל חלק בזמן אמת בעורך האונליין של Luau, בלי שום התקנה. לומדים את מערכת הטיפוסים מאפס? קורס Luau האינטראקטיבי והחינמי של Coddy בונה אותה שיעור אחר שיעור.

שאלות נפוצות על ה-Luau cheat sheet

האם ה-Luau cheat sheet הזה בחינם?
כן. ה-Luau cheat sheet הזה חינמי לגמרי ולא דורש הרשמה. שמרו אותו במועדפים לפעם הבאה שתצטרכו את התחביר של union, של generic או של טבלה עם טיפוסים.
האם יש ב-Luau אופרטור +=?
כן. בניגוד ל-Lua רגילה, Luau תומכת בהשמה מורכבת: +=, -=, *=, /=, //=, %=, ^=, ו-..= לשרשור מחרוזות. לכן hp += 10 הוא Luau תקין (וגם קוד סקריפט תקין ב-Roblox), ואילו ב-Lua 5.1 צריך לכתוב hp = hp + 10. שימו לב שאין ב-Luau ++ או --.
מה ההבדל בין Lua ל-Luau?
Luau היא הרחבה של Lua 5.1 עם מערכת טיפוסים הדרגתית. מעבר לטיפוסים היא מוסיפה שילוב משתנים במחרוזות עם backticks, אופרטורי השמה מורכבת, continue, ביטויי if-then-else, חילוק שלמים //, מעבר כללי על אוספים (for i, v in t do), ופונקציות ספרייה כמו table.find, table.clone ו-table.freeze. לטובת sandboxing היא מסירה את loadstring, loadfile, dofile, ואת הספריות io ו-package, ואין בה goto כי היא מבוססת על 5.1. רוב קוד ה-Lua הרגיל רץ בלי שינוי כ-Luau.
איך מפעילים בדיקת טיפוסים ב-Luau?
שימו הערת מצב בשורה הראשונה של הקובץ: --!strict בודק הכול ומסיק טיפוסים באגרסיביות, --!nonstrict (ברירת המחדל) בודק רק את מה שסימנתם, ו---!nocheck מכבה את הבדיקה. מחוץ לעורך קוד, הריצו luau-analyze main.luau כדי לבדוק טיפוסים בלי להריץ, ו-luau main.luau כדי להריץ.
האם כותבים interface ב-Luau כמו ב-TypeScript?
לא. אין ב-Luau מילת מפתח interface. מבנים של אובייקטים נכתבים כטיפוסי טבלה ומקבלים שם עם type: type User = { name: string, age: number? }. משלבים מבנים עם & במקום extends, ומשתמשים ב-export type כדי להפוך מבנה לזמין למודולים אחרים.
האם דף העזר הזה זהה לכתיבת סקריפטים ב-Roblox?
כל מה שכאן הוא ליבת Luau, כלומר השפה עצמה, ולכן הוא חל גם על סקריפטים ב-Roblox וגם על Luau עצמאית. מה ש*לא* נמצא כאן הוא ה-API של מנוע Roblox (game, workspace, Instance.new, שירותים, אירועים), שהוא ספרייה מעל השפה ומתועד על ידי Roblox, לא על ידי Luau.
איפה אפשר להריץ את קטעי ה-Luau האלה?
בעורך האונליין של Luau: הוא מריץ את מפרש luau האמיתי בדפדפן, עם תמיכה ב-stdin, כך שאפשר להדביק כל שורה מהעמוד הזה וללחוץ Run. לתרגול מסודר, קורס Luau האינטראקטיבי מכסה את אותו חומר עם תרגילים, פרויקטים ותעודה.
איור של שפות התכנות ב-Coddy

ללמוד Luau עם Coddy

להתחיל