מתודות ניתנות לשינוי
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 3 מתוך 61.
לפעמים מתודות צריכות לעשות יותר מאשר רק לקרוא נתונים. הן צריכות לשנות אותם. כדי ליצור מתודות שיכולות לשנות את השדות של struct, אנחנו משתמשים ב־&mut self במקום ב־&self.
מילת המפתח mut מציינת השאלה ניתנת לשינוי, ומעניקה למתודה הרשאה לשנות את המצב הפנימי של המופע:
struct Counter {
value: i32,
}
impl Counter {
fn increment(&mut self) {
self.value += 1;
}
fn decrement(&mut self) {
self.value -= 1;
}
fn get(&self) -> i32 {
self.value
}
}
שימו לב ש־increment ו־decrement משתמשות ב־&mut self כי הן משנות את value, ואילו get משתמשת ב־&self כי היא רק קוראת את הנתונים.
בעת קריאה למתודות שמשנות את המופע, יש להצהיר על המופע עצמו כמשתנה:
fn main() {
let mut counter = Counter { value: 0 };
counter.increment();
counter.increment();
println!("{}", counter.get()); // 2
counter.decrement();
println!("{}", counter.get()); // 1
}
אם תשכחו את מילת המפתח mut כשתיצרו את המופע, Rust תמנע מכם לקרוא לו לכל שיטה של &mut self. כך מובטח שתמיד תהיו מודעים לכך שהנתונים שלכם עשויים להשתנות.
אתגר
קלצרו struct בשם BankAccount עם שדה יחיד: balance (i32).
הוסיפו בלוק מימוש עבור BankAccount עם שלוש מתודות:
deposit: מקבלת את&mut selfואתamount: i32, ומוסיפה את הסכום ליתרהwithdraw: מקבלת את&mut selfואתamount: i32, ומחסרת את הסכום מהיתרהget_balance: מקבלת את&selfומחזירה את היתרה הנוכחית בתורi32
תקבלו שלוש קלטים:
- שורה ראשונה: היתרה ההתחלתית (i32)
- שורה שנייה: סכום ההפקדה (i32)
- שורה שלישית: סכום המשיכה (i32)
צרו מופע mutable של BankAccount עם היתרה ההתחלתית, לאחר מכן הפקידו את הסכום הנתון, משכו את הסכום הנתון והדפיסו את היתרה הסופית.
תבנית הפלט הצפויה:
{final_balance}נסו בעצמכם
use std::io;
// TODO: הגדר כאן את המבנה BankAccount
// TODO: הוסף את בלוק המימוש של BankAccount עם המתודות deposit, withdraw ו-get_balance
fn main() {
let mut input = String::new();
// קרא את היתרה ההתחלתית
io::stdin().read_line(&mut input).expect("Failed to read line");
let initial_balance: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// קרא את סכום ההפקדה
io::stdin().read_line(&mut input).expect("Failed to read line");
let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
input.clear();
// קרא את סכום המשיכה
io::stdin().read_line(&mut input).expect("Failed to read line");
let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
// TODO: צור מופע בר־שינוי של BankAccount עם initial_balance
// TODO: קרא למתודה deposit עם deposit_amount
// TODO: קרא למתודה withdraw עם withdraw_amount
// TODO: הדפס את היתרה הסופית באמצעות get_balance
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין