الـ Struct الخاص بالشاشة
جزء من قسم Object Oriented Programming في رحلة Rust على Coddy — الدرس 52 من 61.
التحدي
سهلالآن حان الوقت لجمع كل مكونات واجهة المستخدم الخاصة بك معاً! ستقوم بإنشاء هيكل 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
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائط