הקפאת טבלאות קבועות
חלק מהיחידה מבוא ל-Luau במסלול ה-Lua של Coddy. שיעור 55 מתוך 73.
לטבלת קבועים יש חולשה אחת: היא עדיין טבלה רגילה. כל קוד, בכל מקום, יכול לכתוב UserRole.Admin = 99, וה״קבועים״ שלך מפסיקים להיות קבועים בלי שתבחין בכך.
Luau סוגרת את הפער באמצעות table.freeze. הקפאה הופכת טבלה ללקריאה בלבד בזמן ריצה: כל ניסיון להוסיף, לשנות או להסיר שדה גורם לשגיאה. הנוהג המקובל הוא להקפיא את הטבלה במקום שבו היא נבנית: table.freeze מחזירה את אותה הטבלה, מוכנה להשמה:
local Color = table.freeze({
Red = 1,
Green = 2,
Blue = 3,
})
print(Color.Red) -- 1: הקריאה פועלת כרגיל
Color.Gold = 4 -- ✗ שגיאה: ניסיון לשנות טבלה לקריאה בלבדבניגוד לכל דבר אחר בקורס הזה עד כה, זו הגנה בזמן ריצה: שגיאה ממשית ברגע שהכתיבה מתבצעת, ולא אזהרה בזמן העריכה. היא מגינה אפילו מפני קוד שבודק הטיפוסים מעולם לא ראה.
שני דברים נוספים שכדאי להכיר: table.isfrozen(t) מחזירה אם טבלה קפואה, וההקפאה היא שטחית: טבלאות מקוננות נשארות ניתנות לשינוי, אלא אם כן מקפיאים גם אותן. אי אפשר גם לבטל את ההקפאה: מרגע שטבלה הוקפאה, היא נשארת קפואה.
טבלת קבועים קפואה יחד עם איחוד ליטרלים לפרמטרים הם כל מה שצריך כדי ליצור enum מלא ב-Luau: ערכי זמן ריצה בעלי שמות שאיש לא יכול לשנות, ובדיקות בזמן העריכה בכל מקום שבו משתמשים בהם.
אתגר
קלצור טבלה קבועה מוקפאת בשם Color, בנה אותה והקפא אותה בצעד אחד באמצעות table.freeze, כך שתכיל:
Red=1Green=2Blue=3
צור טבלה רגילה (שאינה מוקפאת) בשם settings עם שדה volume = 5.
הדפס, כל ערך בשורה נפרדת:
Color.RedColor.Blue- האם
Colorמוקפאת (table.isfrozen) - האם
settingsמוקפאת - התוצאה של הניסיון להוסיף שדה ל-
Colorבתוךpcall: קרא ל-pcall(function() Color.Gold = 4 end)והדפס את הערך הבוליאני שהיא מחזירה
נסו בעצמכם
-- כתבו כאן קוד
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) הדפיסו את Color.Red, את Color.Blue ואת שתי התוצאות של isfrozen
-- 4) השתמשו ב-pcall כדי לנסות את הכתיבה האסורה והדפיסו את הערך הבוליאני שהוחזר
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה מבוא ל-Luau
1תחילת העבודה עם Luau
מהו Luau?למה להשתמש ב-Luau?קוד Luau הראשון שלכםבדיקת טיפוסים ומצבי שגיאהסיכום: מבוא ל-Luau4עבודה עם פונקציות
הגדרת טיפוסים לפרמטרים ולערכי החזרההגדרת טיפוסים לפונקציות אנונימיותפונקציות שאינן מחזירות ערךפרמטרים אופציונלייםערכי ברירת מחדל לפרמטריםפונקציות עם מספר משתנה של ארגומנטיםהגדרת טיפוסי פונקציותסיכום: פונקציות עם טיפוסים2טיפוסי ליבה
טיפוסים בסיסיים: num, str, boolהטיפוס 'any': פתרון מילוטהטיפוס 'unknown'טיפוסי Nil ואופציונלייםהסקת טיפוסים בפעולההצהרות טיפוסים מפורשותסיכום: תרגול טיפוסי ליבה5כינויים, איחודים וחיתוכים
כינויים לסוגים פרימיטיבייםטיפוסי איחודעבודה עם טיפוסי איחודטיפוסים ליטרלייםטיפוסי חיתוךשילוב כינויים לסוגיםסיכום: שילובים מתקדמים של טיפוסים8Enums בדרך של Luau
תבנית ה-Enum ב-LuauEnums מספריים באמצעות טבלאותEnums של מחרוזות כאיחודיםשימוש ב-Enums של איחודי ערכים מילולייםהקפאת טבלאות קבועותסיכום: Enums בדרך של Luau3טבלאות מטיפוס מוגדר: מערכים ומפות
מערכים מטיפוס מוגדרהוספת איברים וקריאתםמהו טיפוס Map?הצהרה על מפות וגישה אליהןמעבר על טבלאותטבלאות בעלות מבנים מעורביםמערכים רב־ממדיים מטיפוס מוגדרtable.unpack ו־Varargsסיכום: מערכים ומפותתרגלו בעצמכם: קומפיילר Luau אונליין