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

الـ Struct الخاص بالشاشة

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

challenge icon

التحدي

سهل

الآن حان الوقت لجمع كل مكونات واجهة المستخدم الخاصة بك معاً! ستقوم بإنشاء هيكل Screen يمكنه الاحتفاظ بمجموعة من المكونات المختلفة القابلة للرسم باستخدام كائنات السمات (trait objects). هذا هو المكان الذي تتجلى فيه قوة Vec<Box<dyn Draw>> حقاً—مجموعة واحدة تدير أنواعاً متعددة من المكونات.

ستضيف وحدة (module) جديدة إلى مشروعك المتنامي:

  • draw.rs: سمة Draw الخاصة بك من التحديات السابقة.
  • text_field.rs: مكون TextField الخاص بك الذي يطبع Text: {content}.
  • button.rs: مكون Button الخاص بك الذي يطبع Button: {label} (width: {width}).
  • screen.rs: أنشئ هيكل Screen يحتوي على حقل عام components من نوع Vec<Box<dyn Draw>>. قم بتنفيذ دالة مرتبطة new لإنشاء شاشة فارغة، وطريقة add تأخذ Box<dyn Draw> وتضيفه إلى متجه المكونات.
  • main.rs: اجمع كل الوحدات معاً. أنشئ Screen، وأضف إليها TextField و Button، ثم قم بالمرور عبر مكونات الشاشة واستدعاء draw() على كل منها.

تحتاج Screen الخاصة بك إلى تخزين كائنات السمات، لذا ستستخدم الكلمة المفتاحية dyn مع سمة Draw الخاصة بك. يجب أن تأخذ الطريقة add المعامل &mut self لأنها تقوم بتعديل متجه المكونات.

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

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

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

Text: Hello
Button: Click Me (width: 80)

جرّب بنفسك

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");

    // TODO: أنشئ Screen باستخدام Screen::new()
    // TODO: أضف TextField مغلفاً بـ Box::new() إلى الشاشة
    // TODO: أضف Button مغلفاً بـ Box::new() إلى الشاشة
    // TODO: قم بالمرور على screen.components واستدعِ draw() لكل مكون
}

جميع دروس Object Oriented Programming