Menu
CoddyTech

בטיחות nil במצב strict

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

הקריסה הנפוצה ביותר ב-Lua היא "attempt to index nil": קוד שהניח שערך קיים, אף שהוא לא היה קיים. התשובה של Luau היא משמעת לגבי nil: תחת --!strict, string רגיל לעולם לא יכול להיות nil. אם nil הוא אפשרות ממשית, הטיפוס חייב לציין זאת באמצעות ?:

--!strict
local nickname: string? = nil   -- תקין: string או nil
local username: string = nil    -- ✗ שגיאת טיפוס במצב strict

המשמעת פועלת בשני הכיוונים: אם יש לך string?, מצב strict לא יאפשר לך להשתמש בו כמחרוזת עד שתשלול את האפשרות שהוא nil. הכלי המקובל הוא השוואה פשוטה, שמצמצמת את הטיפוס בדיוק כמו בדיקת typeof:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- name הוא מחרוזת כאן
    end
    return "NOBODY"
end

כש-nil יהיה באג ולא מקרה תקין, השתמשו ב-assert: אחרי assert(x ~= nil), הבודק מתייחס אל x כאל ערך שאינו nil עד סוף תחום הגישה, ובזמן ריצה ה-assert קורס מוקדם, בדיוק במקום שבו ההנחה שגויה, במקום במקום כלשהו הרחק משם.

התוצאה: הבודק מחייב לטפל בכל ערך ש״עשוי להיות חסר״ בזמן העריכה, ושגיאת זמן הריצה פשוט לא מתרחשת.

challenge icon

אתגר

קל

תנו שם שעשוי להיות חסר לו ערך ברירת מחדל בטוח.

  1. השאירו את --!strict בשורה הראשונה.
  2. כתבו local function getDisplayName(fullName: string?): string שמחזירה את fullName כאשר הוא אינו nil, ואחרת את "Anonymous User".
  3. הדפיסו את getDisplayName("John Smith") ואת getDisplayName(nil).

לחצו על Run Code: הפלט מציג את John Smith ואת Anonymous User.

נסו בעצמכם

--!strict
-- 1) getDisplayName(fullName: string?): string, עם חזרה לערך "Anonymous User" כברירת מחדל
-- 2) הדפס את התוצאה עבור "John Smith" ועבור nil

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

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