שימוש ב-'match' עם 'Option'
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 36 מתוך 66.
עכשיו, אחרי שהבנת מהו Option, נלמד את הדרך הנפוצה והמפורשת ביותר לטפל בו: שימוש בביטוי match. הגישה הזאת מאלצת אותך להביא בחשבון את שני המקרים האפשריים — כשיש ערך וכשאין.
ביטוי ה־match עובד היטב עם Option, כי אפשר ליצור זרועות עבור שתי הווריאציות:
let maybe_name = Some("Alice".to_string());
match maybe_name {
Some(name) => println!("Hello, {}!", name),
None => println!("Hello, stranger!"),
}שימו לב כיצד הזרוע Some(name) מחלצת את הערך מתוך הווריאנט Some. המשתנה name מכיל כעת את ה-String עצמו, ולא את ה-Option. זה נקרא פירוק למרכיבים — אתם שולפים את הערך הפנימי מתוך המעטפת.
הענף None מטפל במקרה שבו אין ערך, ומאפשר לך לספק התנהגות חלופית, כמו הצגת הודעת ברירת מחדל או ביצוע פעולה אחרת לגמרי.
אתגר
קלתקבלו שם של תלמיד כקלט. ייתכן שהשם קיים במערכת או שהוא חסר. צרו Option<String> שמכיל Some(name) אם השם אינו ריק, או None אם השם ריק. השתמשו בביטוי match כדי לטפל בשני המקרים ולהדפיס את ההודעה המתאימה.
דרישות:
- קראו את הקלט כמחרוזת (שם התלמיד)
- הסירו רווחים לבנים מהקלט באמצעות
.trim() - צרו משתנה מסוג
Option<String>:- אם השם לאחר ההסרה אינו ריק, הקצו לו
Some(name.to_string()) - אם השם לאחר ההסרה ריק, הקצו לו
None
- אם השם לאחר ההסרה אינו ריק, הקצו לו
- השתמשו בביטוי
matchכדי לטפל בשתי הגרסאות שלOption - בזרוע
Some(name), הדפיסו:Welcome, [name]! - בזרוע
None, הדפיסו:No name provided
קלט:
- שורה אחת המכילה שם של תלמיד או שורה ריקה
פלט:
- אם סופק שם:
Welcome, [name]! - אם לא סופק שם (קלט ריק):
No name provided
נסו בעצמכם
use std::io;
fn main() {
// קראו את הקלט
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim();
// TODO: צרו Option<String> בהתאם לשאלה אם השם ריק או לא
// TODO: השתמשו בביטוי match כדי לטפל במקרים Some ו-None ולהדפיס את ההודעה המתאימה
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1זרימת בקרה מתקדמת
ביטוי 'match'התאמה למספר ערכיםהתאמה לטווחיםביטוי 'if let'לולאות כביטוייםסיכום – מנתח פקודות פשוט4קיבוץ נתונים באמצעות מבנים
מהו מבנה?סקירה כללית על מבניםגישה לשדות במבנהמבנים הניתנים לשינוימבנים כפרמטרים של פונקציהמבני טופלסיכום – יצירת מבנה ספר7טיפול בשגיאות באמצעות 'Result'
מהו 'Result'?שימוש ב-'match' עם 'Result'is_ok() ו-is_err()קיצורי דרך: unwrap ו-expectאופרטור סימן השאלה '?'המרת מחרוזות למספריםסיכום - פונקציית חילוק בטוחה10Closures ופונקציות אנונימיות
מהו Closure?הגדרת Closure פשוטClosures עם פרמטריםלכידת הסביבהסיכום – Closure פשוט לחיבור2מבוא לווקטורים
מהו וקטור?יצירת וקטורהוספת איברים באמצעות pushגישה לאיברי וקטורמעבר על וקטורמעבר ניתן לשינויהסרת איבריםסיכום – מעקב בסיסי אחר ניקוד5זוגות מפתח-ערך באמצעות מפות גיבוב
מהי מפת גיבוב?יצירת מפת גיבובהוספת זוגות מפתח-ערךגישה לערכיםמעבר על מפת גיבובעדכון ערךהסרת זוגסיכום – מונה מילים6טיפול בהיעדר באמצעות 'Option'
מהו 'Option'?שימוש ב-'match' עם 'Option'is_some() ו-is_none()חילוץ ערך מתוך 'Option'המתודה expectהגדרת ברירת מחדל: unwrap_orסיכום – מציאת איברתרגלו בעצמכם: קומפיילר Rust אונליין