Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

كتل تنفيذ متعددة

جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 5 من 61.

تتيح لك Rust تقسيم methods الخاصة بـ struct عبر عدة كتل impl. رغم أنه يمكن وضع كل شيء في كتلة واحدة، فإن فصلها قد يجعل شفرتك أكثر تنظيمًا وسهولةً في القراءة.

إليك بنية تم تقسيم وظائفها إلى كتلتَي تنفيذ:

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 عبر الإنترنت