בלוקי מימוש מרובים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 5 מתוך 61.
Rust מאפשרת לפצל את המתודות של מבנה בין כמה בלוקי impl. אף שאפשר לכלול הכול בבלוק יחיד, הפרדה ביניהם יכולה להפוך את הקוד שלך למסודר וקריא יותר.
הנה struct שהפונקציונליות שלו מחולקת לשני בלוקי מימוש:
struct BankAccount {
balance: f64,
}
// בנאי ושאילתות בסיסיות
impl BankAccount {
fn new(initial: f64) -> BankAccount {
BankAccount { balance: initial }
}
fn balance(&self) -> f64 {
self.balance
}
}
// מתודות לביצוע פעולות בחשבון
impl BankAccount {
fn deposit(&mut self, amount: f64) {
self.balance += amount;
}
fn withdraw(&mut self, amount: f64) {
self.balance -= amount;
}
}
שני הבלוקים פועלים יחד בצורה חלקה: Rust מתייחסת אליהם כאילו היו בלוק אחד. אפשר לקרוא לכל מתודה, בלי קשר לבלוק שבו היא מוגדרת:
fn main() {
let mut account = BankAccount::new(100.0);
account.deposit(50.0);
println!("{}", account.balance()); // 150
}
התבנית הזאת נעשית שימושית במיוחד ככל שהמבנים שלך גדלים. ייתכן שתרצה לקבץ יחד בנאים, להפריד בין מתודות לקריאה בלבד לבין מתודות שמשנות את הנתונים, או לארגן לפי תכונה. אין הגבלה על מספר בלוקי impl שיכולים להיות למבנה.
אתגר
קלצרו מבנה Player עם שני שדות: name (String) ו-score (u32).
ארגנו את המתודות של המבנה בשני בלוקי מימוש נפרדים:
בלוק ה-impl הראשון: בנאי ושאילתה:
new: פונקציה משויכת שמקבלתname: StringומחזירהPlayerעםscoreשמוגדר ל-0get_score: מקבלת&selfומחזירה את הניקוד הנוכחי כ-u32
בלוק ה-impl השני: שינוי הניקוד:
add_points: מקבלת&mut selfו-points: u32, ומוסיפה את הנקודות לניקודreset_score: מקבלת&mut selfומאפסת את הניקוד ל-0
תקבלו שלוש קלטים:
- שורה ראשונה: שם השחקן (String)
- שורה שנייה: נקודות להוספה בסיבוב הראשון (u32)
- שורה שלישית: נקודות להוספה בסיבוב השני (u32)
צרו שחקן באמצעות Player::new, הוסיפו את נקודות הסיבוב הראשון, הדפיסו את הניקוד, לאחר מכן אפסו את הניקוד, הוסיפו את נקודות הסיבוב השני והדפיסו את הניקוד הסופי.
פורמט הפלט הצפוי:
{score_after_first_round}
{score_after_reset_and_second_round}נסו בעצמכם
use std::io;
// TODO: להגדיר את המבנה Player עם השדות name (String) ו-score (u32)
// TODO: בלוק impl ראשון - בנאי ומתודות לקריאת נתונים (new, get_score)
// TODO: בלוק impl שני - מתודות לשינוי הניקוד (add_points, reset_score)
fn main() {
let mut input = String::new();
// לקרוא את שם השחקן
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim().to_string();
// לקרוא את הנקודות של הסיבוב הראשון
input.clear();
io::stdin().read_line(&mut input).expect("Failed to read line");
let first_round: u32 = input.trim().parse().expect("Invalid number");
// לקרוא את הנקודות של הסיבוב השני
input.clear();
io::stdin().read_line(&mut input).expect("Failed to read line");
let second_round: u32 = input.trim().parse().expect("Invalid number");
// TODO: ליצור שחקן באמצעות Player::new
// TODO: להוסיף את הנקודות של הסיבוב הראשון ולהדפיס את הניקוד
// TODO: לאפס את הניקוד
// TODO: להוסיף את הנקודות של הסיבוב השני ולהדפיס את הניקוד הסופי
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין