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

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

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

challenge icon

التحدي

سهل

حان الوقت الآن لجمع جميع مكوّنات واجهة المستخدم الخاصة بك معًا! ستنشئ بنية Screen يمكنها الاحتفاظ بمجموعة من المكوّنات المختلفة القابلة للرسم باستخدام كائنات السمة. وهنا تتألق قوة Vec<Box<dyn Draw>> حقًا: مجموعة واحدة تدير أنواعًا متعددة من المكوّنات.

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

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

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

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

  • السطر الأول: محتوى حقل النص
  • السطر الثاني: تسمية الزر
  • السطر الثالث: عرض الزر (كعدد)

يجب أن يعرض الناتج كل مكوّن في سطر مستقل، بالترتيب الذي أُضيفت به:

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() على كل مكوّن
}

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

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