מבנה המסך
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 52 מתוך 61.
אתגר
קלעכשיו הגיע הזמן לאחד את כל רכיבי ממשק המשתמש שלך! תיצור מבנה Screen שיכול להכיל אוסף של רכיבים שונים שניתן לצייר, באמצעות אובייקטי trait. כאן בא לידי ביטוי היתרון של Vec<Box<dyn Draw>>: אוסף אחד שמנהל כמה סוגי רכיבים.
תוסיף מודול חדש לפרויקט ההולך וגדל שלך:
draw.rs: ה-traitDrawשלך מאתגרים קודמים.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 שלך צריך לאחסן אובייקטי trait, לכן תשתמש במילת המפתח dyn עם ה-trait שלך, 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פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין