Rust - שימוש ב or ו or_else


שימוש ב Option::or_else מול שימוש ב Option::or

כשאנחנו עובדים עם Rust אנחנו נתקלים הרבה פעמים במקרים בהם נרצה לטפל בהיעדר ערך, כלומר None, ובשביל זה Option נכנס לתמונה. ראסט נותנת לנו כל מיני דרכים לטפל במקרים הללו ושתיים מהדרכים הנפוצות הן or ו- or_else.
בפוסט הזה נדבר על מה הפונקציות האלו עושות ומתי נרצה להשתמש בכל אחת מהן.

מה זה or ו or_else

Option::or היא פונקציה שמאפשרת לנו לתת ערך דיפולטי ולהחזיר אותו במידה וה Option הוא None
Option::or_else עובדת דומה מאוד אך מצפה ל Closure (פונקציה) כפרמטר - אותה פונקציה היא זו שתחשב את הערך הדיפולטי במידה וערך ה Option הוא None.

מתי נשתמש ב - `or`

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


בדוגמה ניתן לראות שיכנס 0 לערך some_value במידה ויהיה None.

הכוח של `or_else`

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


בדוגמה הזו אפשר לראות שהעברנו ל or_else הפעם closure, והוא ירוץ רק אם הערך שיחזור הוא None.

הערה חשובה: ההמלצה תהיה להשתמש ב `or_else` כמעט תמיד, משום שכאשר נשתמש ב `or` הערך יחושב בכל מקרה מבלי קשר לערך ה Option. במילים אחרות, אם נקרא לפונקציה, נאתחל אובייקט או נבצע כל סוג של פעולה, היא תתבצע לפני הקריאה לפונקציה or גם אם הערך שיחזור הוא Some.

מימוש הפונקציות

אחד הדברים שגרמו לי להתאהב בראסט זה שכמעט אף פעם אין קסמים, פשוט אפשר להכנס לפונקציה (go to definition) ולראות איך היא ממומשת, לצד דוקומנטציה מצוינת ודוגמאות שימוש.



ניתן לראות שהמימוש מאוד straightforward. שתי הפונקציות מבצעות match statement, ב `or` בהינתן None נחזיר את הערך שהתקבל לפונקציה, וב `or_else` בהינתן None נריץ את הפונקציה שהתקבלה לפונקציה.

סיכום

שתי הפונקציות עונות על צרכים דומים אבל `or_else` מאפשרת גמישות רבה יותר וגם אופטימיזציה משום שאותה פונקציה שהעברנו תרוץ אך ורק במקרה של None.

חשוב לזכור שאמנם בדוגמה הצגתי ספציפית את or ו or_else אבל אותם עקרונות תקפים בדיוק גם ל ok_or מול ok_or_else ול unwrap_or מול unwrap_or_else כש `else_*` יאפשר כתיבת קוד יעיל, גמיש ורובסטי יותר.

תגובות

פוסטים פופולריים מהבלוג הזה

תכנות מונחה עצמים | Dependency Inversion Principle

מהם קבצי DLL ואיך להשתמש בהם?

מה ההבדל בין אוטומציה לפיתוח רגיל