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

تسلسل الأساليب

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

حتى الآن، كانت أساليب mutable الخاصة بنا تعدّل struct ولا تُرجع شيئًا. لكن ماذا لو أردنا استدعاء عدة أساليب تباعًا على النسخة نفسها؟ من خلال إرجاع مرجع إلى self، نُتيح method chaining: وهو نمط تتدفق فيه استدعاءات method متعددة معًا ضمن expression واحدة.

يكمن المفتاح في جعل أساليب &mut self لديك تُرجع &mut Self:

struct Config {
    debug: bool,
    timeout: u32,
}

impl Config {
    fn new() -> Config {
        Config { debug: false, timeout: 30 }
    }
    
    fn set_debug(&mut self, value: bool) -> &mut Self {
        self.debug = value;
        self
    }
    
    fn set_timeout(&mut self, seconds: u32) -> &mut Self {
        self.timeout = seconds;
        self
    }
}

يعدّل كل method الـ struct، ثم يعيد self: وهو مرجع mutable يعود إلى المثيل نفسه. يتيح ذلك لاستدعاء method التالي مواصلة العمل عليه فورًا:

fn main() {
    let mut config = Config::new();
    
    config.set_debug(true).set_timeout(60);
    
    println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
    // المخرجات: Debug: true, Timeout: 60
}

بدلًا من كتابة three عبارات منفصلة، نضبط كل شيء في سطر واحد سلس. يُعد هذا النمط «على طريقة builder» مفيدًا بشكل خاص عند إعداد كائنات تحتوي على العديد من settings الاختيارية، مما يجعل شيفرتك أكثر إيجازًا وسهولة في القراءة.

challenge icon

التحدي

سهل

أنشئ بنية TextStyle تحتوي على ثلاثة حقول: bold (bool)، وitalic (bool)، وsize (u32).

أضف implementation block لـ TextStyle مع ما يلي:

  • new: associated function تُرجع TextStyle مع ضبط bold على false، وضبط italic على false، وضبط size على 12
  • set_bold: تستقبل &mut self وقيمة bool، وتضبط حقل bold، وتُرجع &mut Self من أجل chaining
  • set_italic: تستقبل &mut self وقيمة bool، وتضبط حقل italic، وتُرجع &mut Self من أجل chaining
  • set_size: تستقبل &mut self وقيمة u32، وتضبط حقل size، وتُرجع &mut Self من أجل chaining

ستتلقى three مدخلات:

  • السطر الأول: إعداد bold (true أو false)
  • السطر الثاني: إعداد italic (true أو false)
  • السطر الثالث: حجم الخط (u32)

أنشئ TextStyle قابلًا للتغيير باستخدام new، ثم استخدم method chaining لتطبيق all three settings في single expression. اطبع الحالة النهائية بالـ format الموضح أدناه.

تنسيق المخرجات المتوقعة:

Bold: {bold}, Italic: {italic}, Size: {size}

جرّب بنفسك

use std::io;

// TODO: عرّف الـ struct TextStyle هنا


// TODO: أضف كتلة التنفيذ لـ TextStyle مع:
// - الدالة المرتبطة new()
// - الـ method set_bold()
// - الـ method set_italic()
// - الـ method set_size()


fn main() {
    let mut input = String::new();
    
    // اقرأ إعداد bold
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let bold: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // اقرأ إعداد italic
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let italic: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // اقرأ إعداد size
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let size: u32 = input.trim().parse().expect("Invalid u32");
    
    // TODO: أنشئ TextStyle قابلاً للتعديل باستخدام new()، ثم استخدم method chaining
    // لتطبيق الإعدادات الثلاثة جميعها في تعبير واحد
    
    
    // TODO: اطبع النتيجة بالتنسيق: Bold: {bold}, Italic: {italic}, Size: {size}
    
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت