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

تشغيل الشاشة

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

challenge icon

التحدي

سهل

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

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

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

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

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

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

  • السطر الأول: محتوى حقل النص (text field)
  • السطر الثاني: تسمية الزر (button's label)
  • السطر الثالث: عرض الزر (button's width) (كرقم)

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

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();
    }
}

جميع دروس Object Oriented Programming