מבנים הניתנים לשינוי
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 23 מתוך 66.
כברירת מחדל, מופעים של מבנים ב-Rust אינם ניתנים לשינוי — לאחר שיוצרים אותם, אי אפשר לשנות את ערכי השדות שלהם. עם זאת, כמו משתנים אחרים, אפשר להפוך מופע של מבנה לניתן לשינוי על ידי הוספת מילת המפתח mut בעת ההכרזה עליו.
כשמכריזים על מופע של struct כניתן לשינוי, אפשר לשנות כל אחד מהשדות שלו באמצעות סימון נקודה:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // זה עובד כי player ניתן לשינויבלי מילת המפתח mut, ניסיון לשנות שדה יגרום לשגיאת קומפילציה. המוטביליות חלה על מופע המבנה כולו — אי אפשר להפוך שדות מסוימים למוטביליים ולהשאיר אחרים בלתי־מוטביליים.
אתגר
קלתקבלו ארבעה קלטים: שם של שחקן, ניקוד התחלתי (כמספר שלם), ניקוד בונוס שיש להוסיף (כמספר שלם) והתאמה סופית לניקוד (כמספר שלם). הגדירו struct בשם Player עם שני שדות: name מטיפוס String ו-score מטיפוס i32. צרו מופע בר-שינוי של ה-struct הזה, ואז שנו את שדה הניקוד כמה פעמים באמצעות ערכי הקלט.
דרישות:
- הגדירו struct בשם
Playerעם השדות:name: Stringו-score: i32 - קראו את הקלט הראשון בתור שם השחקן
- קראו את הקלט השני והמירו אותו ל-
i32עבור הניקוד ההתחלתי - צרו מופע בר-שינוי של ה-struct
Playerעם הערכים האלה - קראו את הקלט השלישי והמירו אותו ל-
i32עבור ניקוד הבונוס - הוסיפו את ניקוד הבונוס לניקוד הנוכחי של השחקן באמצעות תחביר נקודה
- קראו את הקלט הרביעי והמירו אותו ל-
i32עבור ההתאמה הסופית - הוסיפו את ההתאמה הסופית לניקוד הנוכחי של השחקן
- הדפיסו את פרטי השחקן בפורמט המדויק שמוצג למטה
קלט:
- שורה ראשונה: שם השחקן (לדוגמה,
Alice) - שורה שנייה: הניקוד ההתחלתי כמספר שלם (לדוגמה,
50) - שורה שלישית: ניקוד הבונוס כמספר שלם (לדוגמה,
30) - שורה רביעית: ההתאמה הסופית כמספר שלם (לדוגמה,
20)
פלט:
- שורה ראשונה:
Player: [name] - שורה שנייה:
Final Score: [score]
נסו בעצמכם
use std::io;
// TODO: הגדירו כאן את המבנה Player עם השדות name ו-score
fn main() {
// קראו את שם השחקן
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// קראו את הניקוד ההתחלתי
let mut initial_score = String::new();
io::stdin().read_line(&mut initial_score).expect("Failed to read line");
let initial_score: i32 = initial_score.trim().parse().expect("Invalid number");
// קראו את ניקוד הבונוס
let mut bonus = String::new();
io::stdin().read_line(&mut bonus).expect("Failed to read line");
let bonus: i32 = bonus.trim().parse().expect("Invalid number");
// קראו את ההתאמה הסופית
let mut adjustment = String::new();
io::stdin().read_line(&mut adjustment).expect("Failed to read line");
let adjustment: i32 = adjustment.trim().parse().expect("Invalid number");
// TODO: צרו מופע ניתן לשינוי של Player
// TODO: הוסיפו את ניקוד הבונוס לניקוד של השחקן
// TODO: הוסיפו את ההתאמה הסופית לניקוד של השחקן
// TODO: הדפיסו את הפלט בפורמט הנדרש
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1זרימת בקרה מתקדמת
ביטוי 'match'התאמה למספר ערכיםהתאמה לטווחיםביטוי 'if let'לולאות כביטוייםסיכום – מנתח פקודות פשוט4קיבוץ נתונים באמצעות מבנים
מהו מבנה?סקירה כללית על מבניםגישה לשדות במבנהמבנים הניתנים לשינוימבנים כפרמטרים של פונקציהמבני טופלסיכום – יצירת מבנה ספר7טיפול בשגיאות באמצעות 'Result'
מהו 'Result'?שימוש ב-'match' עם 'Result'is_ok() ו-is_err()קיצורי דרך: unwrap ו-expectאופרטור סימן השאלה '?'המרת מחרוזות למספריםסיכום - פונקציית חילוק בטוחה10Closures ופונקציות אנונימיות
מהו Closure?הגדרת Closure פשוטClosures עם פרמטריםלכידת הסביבהסיכום – Closure פשוט לחיבור2מבוא לווקטורים
מהו וקטור?יצירת וקטורהוספת איברים באמצעות pushגישה לאיברי וקטורמעבר על וקטורמעבר ניתן לשינויהסרת איבריםסיכום – מעקב בסיסי אחר ניקוד5זוגות מפתח-ערך באמצעות מפות גיבוב
מהי מפת גיבוב?יצירת מפת גיבובהוספת זוגות מפתח-ערךגישה לערכיםמעבר על מפת גיבובעדכון ערךהסרת זוגסיכום – מונה מיליםתרגלו בעצמכם: קומפיילר Rust אונליין