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