Menu
Coddy logo textTech

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

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

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

--!strict
local nickname: string? = nil   -- תקין: string OR 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 הוא מסוג string כאן
    end
    return "NOBODY"
end

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

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

challenge icon

אתגר

קל

עבדו עם שדות בפרופיל משתמש שעשויים להיות חסרים. התחילו את הקובץ שלכם ב־--!strict.

  • getDisplayName(fullName: string?): string: מחזירה את fullName אם הוא אינו nil, אחרת Anonymous User.
  • formatEmail(email: string?): string: מחזירה את כתובת האימייל באותיות קטנות (string.lower) אם היא אינה nil, אחרת No email provided.
  • getUserInfo(name: string?, email: string?): string: משתמשת בשתי הפונקציות ומחזירה Name: [processed name], Email: [processed email].

לאחר מכן הדפיסו, כל אחד בשורה נפרדת:

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. getUserInfo("Sarah Wilson", nil)

נסו בעצמכם

--!strict
-- כתבו כאן את הקוד
-- 1) getDisplayName(fullName: string?): string — בדקו אם הערך הוא nil, והשתמשו בערך ברירת המחדל "Anonymous User"
-- 2) formatEmail(email: string?): string — השתמשו ב־string.lower או ב־"No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — שלבו את שניהם
-- 4) הדפיסו את שבע קריאות הבדיקה מהמשימה
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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