בטיחות 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 גורם לקריסה מוקדמת, בדיוק במקום שבו ההנחה שגויה, במקום במקום מרוחק.
התועלת: הבודק מאלץ אותך לטפל בכל ערך ש״ייתכן שחסר״ בזמן העריכה, ושגיאת זמן הריצה פשוט לא מתרחשת.
אתגר
קלעבדו עם שדות בפרופיל משתמש שעשויים להיות חסרים. התחילו את הקובץ שלכם ב־--!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].
לאחר מכן הדפיסו, כל אחד בשורה נפרדת:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)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) הדפיסו את שבע קריאות הבדיקה מהמשימה
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה מבוא ל-Luau
1תחילת העבודה עם Luau
מהו Luau?למה להשתמש ב-Luau?קוד Luau הראשון שלכםבדיקת טיפוסים ומצבי שגיאהסיכום: מבוא ל-Luau4עבודה עם פונקציות
הגדרת טיפוסים לפרמטרים ולערכי החזרההגדרת טיפוסים לפונקציות אנונימיותפונקציות שאינן מחזירות ערךפרמטרים אופציונלייםערכי ברירת מחדל לפרמטריםפונקציות עם מספר משתנה של ארגומנטיםהגדרת טיפוסי פונקציותסיכום: פונקציות עם טיפוסים2טיפוסי ליבה
טיפוסים בסיסיים: num, str, boolהטיפוס 'any': פתרון מילוטהטיפוס 'unknown'טיפוסי Nil ואופציונלייםהסקת טיפוסים בפעולההצהרות טיפוסים מפורשותסיכום: תרגול טיפוסי ליבה5כינויים, איחודים וחיתוכים
כינויים לסוגים פרימיטיבייםטיפוסי איחודעבודה עם טיפוסי איחודטיפוסים ליטרלייםטיפוסי חיתוךשילוב כינויים לסוגיםסיכום: שילובים מתקדמים של טיפוסים8Enums בדרך של Luau
תבנית ה-Enum ב-LuauEnums מספריים באמצעות טבלאותEnums של מחרוזות כאיחודיםשימוש ב-Enums של איחודי ערכים מילולייםהקפאת טבלאות קבועותסיכום: Enums בדרך של Luau11נושאים מתקדמים
הצהרות טיפוסשומרי טיפוס עם typeofהטיפוס neverבטיחות nil במצב strictחתימות אינדקססיכום: כוונון עדין של טיפוסים3טבלאות מטיפוס מוגדר: מערכים ומפות
מערכים מטיפוס מוגדרהוספת איברים וקריאתםמהו טיפוס Map?הצהרה על מפות וגישה אליהןמעבר על טבלאותטבלאות בעלות מבנים מעורביםמערכים רב־ממדיים מטיפוס מוגדרtable.unpack ו־Varargsסיכום: מערכים ומפותתרגלו בעצמכם: קומפיילר Luau אונליין