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

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

جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 5 من 61.

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

إليك هيكل (struct) تم تقسيم وظائفه إلى كتلتين من كتل التنفيذ (implementation blocks):

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 كما لو كانتا كتلة واحدة. يمكنك استدعاء أي طريقة (method) بغض النظر عن الكتلة التي تم تعريفها فيها:

fn main() {
    let mut account = BankAccount::new(100.0);
    account.deposit(50.0);
    println!("{}", account.balance()); // 150
}

يصبح هذا النمط مفيداً بشكل خاص مع نمو الـ structs الخاصة بك. قد تقوم بتجميع المنشئات (constructors) معاً، أو فصل الدوال المخصصة للقراءة فقط عن تلك التي تقوم بالتعديل، أو التنظيم حسب الميزة. لا يوجد حد لعدد كتل impl التي يمكن أن يمتلكها الـ struct.

challenge icon

التحدي

سهل

قم بإنشاء هيكل Player يحتوي على حقلين: name (String) و score (u32).

قم بتنظيم دوال الهيكل عبر كتلتي تنفيذ (implementation blocks) منفصلتين:

كتلة impl الأولى — المنشئ والاستعلام:

  • new — دالة مرتبطة (associated function) تأخذ 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}

ورقة مرجعية

تسمح لغة Rust بتقسيم دوال (methods) الهيكل (struct) عبر عدة كتل impl لتنظيم أفضل:

struct BankAccount {
    balance: f64,
}

// كتلة impl الأولى
impl BankAccount {
    fn new(initial: f64) -> BankAccount {
        BankAccount { balance: initial }
    }
    
    fn balance(&self) -> f64 {
        self.balance
    }
}

// كتلة impl الثانية
impl BankAccount {
    fn deposit(&mut self, amount: f64) {
        self.balance += amount;
    }
    
    fn withdraw(&mut self, amount: f64) {
        self.balance -= amount;
    }
}

تعمل جميع الدوال من كتل impl المختلفة معاً بسلاسة:

let mut account = BankAccount::new(100.0);
account.deposit(50.0);
println!("{}", account.balance()); // 150

لا يوجد حد لعدد كتل impl التي يمكن أن يمتلكها الهيكل (struct). هذا النمط مفيد لتجميع الوظائف ذات الصلة، مثل فصل المنشئات (constructors) عن الدوال التي تقوم بالتعديل (mutating methods).

جرّب بنفسك

use std::io;

// TODO: (String) وحقل النتيجة (u32) مع حقل الاسم Player قم بتعريف هيكل


// TODO: (get_score و new) دوال الإنشاء والاستعلام - الأولى impl كتلة


// TODO: (reset_score و add_points) دوال تعديل النتيجة - الثانية impl كتلة


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");
    
    // Player::new باستخدام اللاعب إنشاء :TODO
    // إضافة نقاط الجولة الأولى وطباعة النتيجة :TODO
    // إعادة تعيين النتيجة :TODO
    // إضافة نقاط الجولة الثانية وطباعة النتيجة النهائية :TODO
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming