كتل تنفيذ متعددة
جزء من قسم البرمجة كائنية التوجه في رحلة 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 التي يمكن أن يمتلكها الهيكل.
التحدي
سهلأنشئ بنية Player تحتوي على حقلين: name (String) وscore (u32).
نظّم أساليب البنية ضمن كتلتي تنفيذ منفصلتين:
كتلة impl الأولى: المُنشئ والاستعلام:
new: دالة مرتبطة تأخذname: StringوتُرجعPlayerمع تعيينscoreإلى0get_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: أضف نقاط الجولة الثانية واطبع النتيجة النهائية
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت