פונקציית זהות גנרית
חלק מהיחידה מבוא ל-Luau במסלול ה-Lua של Coddy. שיעור 58 מתוך 73.
הנה פונקציית הזהות כפי שצריך, בתור פונקציה גנרית:
local function identity<T>(value: T): T
return value
endה־<T> שאחרי שם הפונקציה מצהיר על פרמטר טיפוס: מציין מקום שמייצג "טיפוס כלשהו, שנקבע בכל קריאה". בתוך החתימה משתמשים ב־T בדיוק כמו בטיפוס אמיתי: הפרמטר הוא T, והפונקציה מחזירה T.
השימוש באותו T לקלט ולפלט הוא כל העניין. הוא קושר אותם יחד. קראו ל־identity("hello") והבודק יקבע T = string עבור הקריאה הזאת, ולכן התוצאה היא string. קראו ל־identity(42) ו־T = number, ולכן התוצאה היא number. גוף אחד, כל הטיפוסים, ושום דבר לא אובד.
T הוא רק שם מקובל (קיצור של "Type"): גם <Item> או <Value> מתאימים באותה מידה. וכמו תמיד ב־Luau, הסוגריים הזוויתיים קיימים רק עבור הבודק: בזמן ריצה זו פונקציית Lua רגילה function identity(value) return value end.
אתגר
קלצרו פונקציה גנרית בשם identity ש:
- מכריזה על פרמטר טיפוס
T - מקבלת פרמטר אחד בשם
valueמטיפוסT - מחזירה את הערך הזה, עם טיפוס החזרה
T
לאחר מכן צרו את המשתנים המוגדרים לפי טיפוס באמצעות הפונקציה שלכם:
luckyNumberמטיפוסnumber: קראו ל־identityעם7greetingמטיפוסstring: קראו ל־identityעם"Hello, Luau!"isReadyמטיפוסboolean: קראו ל־identityעםtrue
הדפיסו את הפריטים הבאים, כל אחד בשורה נפרדת:
luckyNumbergreetingisReady- התוצאה של קריאה ל־
identityעם"<code>generics" ישירות בתוךprint - התוצאה של קריאה ל־
identityעם99ישירות בתוךprint
נסו בעצמכם
-- כתבו כאן קוד
-- 1) הגדירו identity<T>(value: T): T
-- 2) צרו את luckyNumber, greeting ו-isReady באמצעות קריאות ל-identity
-- 3) הדפיסו אותם, ואז הדפיסו את identity(הטקסט המדויק מההוראות) ואת identity(99)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה מבוא ל-Luau
1תחילת העבודה עם Luau
מהו Luau?למה להשתמש ב-Luau?קוד Luau הראשון שלכםבדיקת טיפוסים ומצבי שגיאהסיכום: מבוא ל-Luau4עבודה עם פונקציות
הגדרת טיפוסים לפרמטרים ולערכי החזרההגדרת טיפוסים לפונקציות אנונימיותפונקציות שאינן מחזירות ערךפרמטרים אופציונלייםערכי ברירת מחדל לפרמטריםפונקציות עם מספר משתנה של ארגומנטיםהגדרת טיפוסי פונקציותסיכום: פונקציות עם טיפוסים2טיפוסי ליבה
טיפוסים בסיסיים: num, str, boolהטיפוס 'any': פתרון מילוטהטיפוס 'unknown'טיפוסי Nil ואופציונלייםהסקת טיפוסים בפעולההצהרות טיפוסים מפורשותסיכום: תרגול טיפוסי ליבה5כינויים, איחודים וחיתוכים
כינויים לסוגים פרימיטיבייםטיפוסי איחודעבודה עם טיפוסי איחודטיפוסים ליטרלייםטיפוסי חיתוךשילוב כינויים לסוגיםסיכום: שילובים מתקדמים של טיפוסים3טבלאות מטיפוס מוגדר: מערכים ומפות
מערכים מטיפוס מוגדרהוספת איברים וקריאתםמהו טיפוס Map?הצהרה על מפות וגישה אליהןמעבר על טבלאותטבלאות בעלות מבנים מעורביםמערכים רב־ממדיים מטיפוס מוגדרtable.unpack ו־Varargsסיכום: מערכים ומפות6הוספת טיפוסים למבני טבלה
הערות טיפוס בשורה למבניםכינויי טיפוס למבניםמאפיינים אופציונלייםמבנים לעומת טבלאות לא מובנותהרחבת מבניםהוספת מתודות למבניםSelf ומתודות עם נקודתייםסיכום: הגדרת מבני טבלה9מבט ראשון על טיפוסים גנריים
הבעיה שטיפוסים גנריים פותריםפונקציית זהות גנריתשימוש בפונקציה גנריתמערכים גנרייםכינויי טיפוס גנרייםסיכום: פונקציות גנריותתרגלו בעצמכם: קומפיילר Luau אונליין