בטיחות 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 קורס מוקדם, בדיוק במקום שבו ההנחה שגויה, במקום במקום כלשהו הרחק משם.
התוצאה: הבודק מחייב לטפל בכל ערך ש״עשוי להיות חסר״ בזמן העריכה, ושגיאת זמן הריצה פשוט לא מתרחשת.
אתגר
קלתנו שם שעשוי להיות חסר לו ערך ברירת מחדל בטוח.
- השאירו את
--!strictבשורה הראשונה. - כתבו
local function getDisplayName(fullName: string?): stringשמחזירה אתfullNameכאשר הוא אינוnil, ואחרת את"Anonymous User". - הדפיסו את
getDisplayName("John Smith")ואתgetDisplayName(nil).
לחצו על Run Code: הפלט מציג את John Smith ואת Anonymous User.
נסו בעצמכם
--!strict
-- 1) getDisplayName(fullName: string?): string, עם חזרה לערך "Anonymous User" כברירת מחדל
-- 2) הדפס את התוצאה עבור "John Smith" ועבור nil
כל השיעורים ביחידה מבוא ל-Luau
1תחילת העבודה עם Luau
מהו Luau?למה להשתמש ב-Luau?קוד Luau הראשון שלכםבדיקת טיפוסים ומצבי שגיאהסיכום: מבוא ל-Luau4עבודה עם פונקציות
הגדרת טיפוסים לפרמטרים ולערכי החזרההגדרת טיפוסים לפונקציות אנונימיותפונקציות שאינן מחזירות ערךפרמטרים אופציונלייםערכי ברירת מחדל לפרמטריםערכי ברירת מחדל לבוליאניםפונקציות עם מספר משתנה של ארגומנטיםהגדרת טיפוסי פונקציותסיכום: פונקציות עם טיפוסים2טיפוסי ליבה
מספר, מחרוזת ובוליאניהטיפוס 'any': פתרון מילוטהטיפוס 'unknown'טיפוסי Nil ואופציונלייםהסקת טיפוסים בפעולההצהרות טיפוס מפורשותסיכום: תרגול בטיפוסי ליבה5כינויים, איחודים וחיתוכים
כינויים לסוגים פרימיטיבייםטיפוסי איחודעבודה עם טיפוסי איחודטיפוסים ליטרלייםטיפוסי חיתוךשילוב כינויים לסוגיםסיכום: שילובים מתקדמים של טיפוסים8Enums בדרך של Luau
תבנית ה-Enum ב-LuauEnums מספריים באמצעות טבלאותEnums של מחרוזות כאיחודיםשימוש ב-Enums של איחודי ערכים מילולייםהקפאת טבלאות קבועותסיכום: Enums בדרך של Luau11נושאים מתקדמים
הצהרות טיפוסשומרי טיפוס עם typeofהטיפוס neverבטיחות nil במצב strictחתימות אינדקססיכום: טיפוסי ערכי התצורהסיכום: כוונון עדין של טיפוסים3טבלאות מטיפוס מוגדר: מערכים ומפות
מערכים מטיפוס מוגדרהוספה וקריאה של איבריםמהו טיפוס Map?הגדרה וגישה למפותמעבר על טבלאותטבלאות במבנים מעורביםקריאת רשתבניית רשתtable.unpackסיכום: מערכים ומפותתרגלו בעצמכם: קומפיילר Luau אונליין