Menu
Coddy logo textTech

מתודות ניתנות לשינוי

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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. כך מובטח שתמיד תהיו מודעים לכך שהנתונים שלכם עשויים להשתנות.

challenge icon

אתגר

קל

צרו 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
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Rust אונליין