Menu
Coddy logo textTech

בלוקי מימוש מרובים

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

challenge icon

אתגר

קל

צרו מבנה Player עם שני שדות: name (String) ו-score (u32).

ארגנו את המתודות של המבנה בשני בלוקי מימוש נפרדים:

בלוק ה-impl הראשון: בנאי ושאילתה:

  • new: פונקציה משויכת שמקבלת name: String ומחזירה Player עם score שמוגדר ל-0
  • get_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: להוסיף את הנקודות של הסיבוב השני ולהדפיס את הניקוד הסופי
}
quiz iconבחנו את עצמכם

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

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

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