Menu
CoddyTech

הקפאת טבלאות קבועות

חלק מהיחידה מבוא ל-Luau במסלול ה-Lua של Coddy. שיעור 59 מתוך 80.

לטבלת קבועים יש חולשה אחת: היא עדיין טבלה רגילה. כל קוד, בכל מקום, יכול לכתוב 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: ערכים בעלי שמות בזמן ריצה שאיש אינו יכול לשנות, ובדיקת טיפוסים בזמן עריכה בכל מקום שבו משתמשים בהם.

challenge icon

אתגר

קל

צרו טבלה קבועה שאי אפשר לשנות.

  1. צרו local Size = table.freeze({Small = 1, Medium = 2, Large = 3}).
  2. הדפיסו את Size.Large ואת table.isfrozen(Size).
  3. שמרו את pcall(function() Size.Huge = 4 end) בתוך local ok והדפיסו את ok.

לחצו על הרצת קוד: הפלט מציג 3, true ו-false.

נסו בעצמכם

-- 1) local Size = table.freeze({...})
-- 2) הדפס את Size.Large ואת table.isfrozen(Size)
-- 3) שמור ב-ok את מה ש-pcall מחזירה עבור ניסיון הכתיבה האסור, והדפס אותו

כל השיעורים ביחידה מבוא ל-Luau

תרגלו בעצמכם: קומפיילר Luau אונליין