בראסט ה Enums טובים יותר
Enums בראסט
ברוב השפות, enums מייצגים אוסף קבוע וסגור של ערכים שניתן לבחור מתוכם. לדוגמה, אפשר להשתמש ב-enum כדי לייצג ימים בשבוע, צבעים או סוגי אירועים. אבל enums מסורתיים הם בדרך כלל מבנים די מוגבלים. ב-Rust, לעומת זאת, enums הם הרבה יותר גמישים; הם מאפשרים לכל variant (או ערך) לשאת נתונים משלו ולהשתמש במערכת הטיפוסים החזקה של השפה כדי להבטיח טיפול בטוח בכל אפשרות.
היתרונות העיקריים
- החזקת נתונים מורכבים – כל variant ב-Rust יכול לשאת נתונים ייחודיים. כלומר, אנחנו לא מוגבלים לערכים סטטיים בלבד, אלא יכולים להוסיף נתונים לכל אפשרות.
- exhaustive pattern matching - ראסט מבטיחה שכשנתמש ב enum נהיה חייבים להתייחס לכל אחד מהוריאנטים שלו, דבר שמקטין את מרווח הטעות לפספוסים.
- פולימורפיזם - העובדה שהוריאנטים שלנו יכולים להחזיק data והעובדה שכשנעשה match על המידע הזה נהיה חייבים לטפל בכל הוריאנטים נותנת לנו את היכולות להתמודד ולטפל באובייקטים שונים בזמן ריצה בצורה נוחה, יעילה ובטוחה.
היתרונות הללו הופכים enums לבחירה חזקה במקרים בהם צריך לייצג מבני נתונים מורכבים יותר, גם בלי לכתוב קוד מורכב או בלי לבצע ירושה קלאסית.
החזקת מידע ו pattern matching
נסתכל על הדוגמה הפשוטה הזו ל enum שמייצג הודעה שהמערכת שלנו יכולה לקבל ואיך אנחנו יכולים להשתמש בenum כדי לפתוח את ההודעה ולטפל בה.בחלק הראשון אנחנו מגדירים את ה enum ובו 4 וריאנטים, הראשון בסיסי ולא מחזיק מידע, השני מידע ״מורכב״, השלישי מחזיק ownership לאובייקט על ה heap והרביעי יחזיק שלושה מספרים.
כעת בחלק השני, נוכל לכתוב פונקציה על אותו טיפוס Message שהגדרנו שתעבד אותו ותקבל החלטה בהתאם לוריאנט שאותחל. בשימוש ב match נהיה חייבים לטפל בכל הוריאנטים האפשריים שקיימים ב enum, אחרת - נקבל שגיאת קומפילציה דומה לזו:
פולימורפיזם
פולימורפיזם מאפשר למתכנתים לכתוב פונקציות או מבנים שיכולים לעבוד עם אובייקטים מסוגים שונים תוך שימוש בממשק אחיד. ב-Rust, ה-enums הם פתרון חזק לפולימורפיזם, מפני שהם מאפשרים לשלב התנהגויות שונות מבלי להשתמש בירושה מסורתית או בתכנות מונחה עצמים.
למשל, נניח שאנחנו רוצים לייצג צורות גיאומטריות שונות. ב enum נוכל להגדיר את כל סוגי הצורות ולתת לכל אחת מהן מאפיינים שונים. כך, ניתן לבצע פולימורפיזם על ידי מימוש התנהגות ייחודית לכל variant בזמן הטיפול בו.
כאן, הגדרת Shape
מאפשרת לנו ליצור Circle
עם רדיוס ו-Rectangle
עם גובה ורוחב, ולחשב את השטח של כל אחד מהם דרך פונקציית area
. אנחנו רואים שבמקום להגדיר מחלקות שונות לכל צורה, אנחנו משתמשים ב-enum כדי לרכז את כל המידע הרלוונטי במקום אחד ולספק פונקציות התנהגות לכל אפשרות.
תגובות
הוסף רשומת תגובה