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

تشغيل الشاشة

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

challenge icon

التحدي

سهل

تهانينا على وصولك إلى الخطوة النهائية من مشروع Document System! لقد أنشأت جميع الأجزاء الفردية: سمة Draw، وTextField، وButton، وScreen. حان الوقت الآن لمنح Screen القدرة على عرض جميع مكوناته دفعةً واحدة باستدعاء single method.

ستكمل مشروعك بإضافة method باسم run إلى بنية Screen. ستتكرر هذه method عبر جميع components المخزنة في screen وتستدعي draw() على كل واحد منها، مما يجعل نظام المستندات بالكامل يعمل.

ملفات مشروعك:

  • draw.rs: سمة Draw الخاصة بك مع method draw.
  • text_field.rs: مكون TextField الخاص بك الذي يطبع Text: {content}.
  • button.rs: مكون Button الخاص بك الذي يطبع Button: {label} (width: {width}).
  • screen.rs: بنية Screen الخاصة بك مع methodَي new وadd. أضف method باسم run يأخذ &self ويستدعي draw() على every component في المجموعة.
  • main.rs: اجمع كل شيء معًا: أنشئ Screen، وأضف components الخاصة بك، واستدعِ run() لعرض الشاشة بالكامل دفعةً واحدة.

تغلف method run منطق العرض داخل Screen، مما يجعل دالة main الخاصة بك نظيفة وبسيطة. وبدلًا من التكرار يدويًا عبر components داخل main، ما عليك سوى استدعاء screen.run().

سيتم توفير المدخلات التالية:

  • السطر الأول: محتوى حقل text
  • السطر الثاني: label الخاص بالزر
  • السطر الثالث: width الخاص بالزر (كعدد)

يجب أن يعرض الناتج كل component في سطر خاص به، بالترتيب الذي تمت إضافته به:

Text: Dashboard
Button: Save (width: 120)

جرّب بنفسك

mod draw;
mod text_field;
mod button;
mod screen;

use draw::Draw;
use text_field::TextField;
use button::Button;
use screen::Screen;

pub struct Label {
    pub text: String,
}

impl Draw for Label {
    fn draw(&self) {
        println!("{}", self.text);
    }
}

fn main() {
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let content = input1.trim().to_string();

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let label = input2.trim().to_string();

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let width: u32 = input3.trim().parse().expect("Failed to parse width");

    let mut screen = Screen::new();

    let text_field = TextField { content };
    screen.add(Box::new(text_field));

    let button = Button { label, width };
    screen.add(Box::new(button));

    // TODO: استبدل التكرار اليدوي أدناه باستدعاء واحد لـ screen.run()
    for component in &screen.components {
        component.draw();
    }
}

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

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