מתודות ב-Enums
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 15 מתוך 61.
בדומה למבנים, אפשר להגדיר מתודות למנויים בתוך בלוקי impl. כך אפשר לשייך התנהגות ישירות לסוג המנוי, ולהקל על העבודה עם וריאנטים שונים באמצעות ממשק אחיד.
כך מוסיפים מתודה למנייה Message מהשיעור הקודם:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
impl Message {
fn describe(&self) -> String {
match self {
Message::Quit => String::from("Quit signal"),
Message::Move { x, y } => format!("Move to ({}, {})", x, y),
Message::Write(text) => format!("Message: {}", text),
}
}
}
הבלוק impl Message פועל בדיוק כמו עבור מבנים. המתודה מקבלת את &self כדי לגשת למופע של המנאם. בתוך המתודה, משתמשים ב-match כדי לקבוע עם איזו וריאנט מתמודדים ולהחזיר את התוצאה המתאימה.
הקריאה למתודה נראית זהה, ללא קשר לאיזו וריאציה יש לך:
fn main() {
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
println!("{}", m1.describe()); // אות Quit
println!("{}", m2.describe()); // Move אל (10, 20)
}
התבנית הזו עוצמתית כי הקורא לא צריך לדעת איזו וריאציה יש לו. הוא פשוט קורא למתודה, וה־enum מטפל בכל השאר באופן פנימי. ההתנהגות משתנה בהתאם לווריאציה, אבל הממשק נשאר עקבי.
אתגר
קלנבנה מערכת רמזורים שמשתמשת ב-enum עם מתודות לתיאור מצב האות הנוכחי. כל צבע של רמזור יישא מידע על משך הזמן שבו הוא דולק, ומתודה תספק תיאור קריא לבני אדם.
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
traffic.rs: הגדירו enum ציבורי בשםTrafficLightעם שלוש וריאציות:Red: מכילהu32שמייצג את מספר השניות שיש להמתיןYellow: מכילהu32שמייצג את מספר השניות שיש להמתיןGreen: מכילהu32שמייצג את מספר השניות שבהן אפשר לנסוע
statusשמחזירהStringהמתארת את הרמזור. השתמשו ב-matchבתוך המתודה כדי לטפל בכל וריאציה ולכלול את משך הזמן בהודעה.main.rs: יבאו את מודול הרמזורים, צרו מופעים של כל וריאציה של רמזור, וקראו למתודתstatusבכל אחד מהם כדי להדפיס את התיאורים.
מתודת status צריכה להחזיר הודעות בדיוק בפורמטים הבאים:
- עבור
Red:Stop for {seconds} seconds - עבור
Yellow:Caution for {seconds} seconds - עבור
Green:Go for {seconds} seconds
הפלט שלכם צריך להציג את המצב של כל רמזור בשורה נפרדת:
Stop for {seconds} seconds
Caution for {seconds} seconds
Go for {seconds} secondsלדוגמה, עבור רמזור אדום שנמשך 30 שניות, צהוב שנמשך 5 שניות, וירוק שנמשך 25 שניות, הפלט יהיה:
Stop for 30 seconds
Caution for 5 seconds
Go for 25 secondsתקבלו שלוש קלטים: משך הזמן של הרמזור האדום, משך הזמן של הרמזור הצהוב, ומשך הזמן של הרמזור הירוק.
נסו בעצמכם
mod traffic;
use traffic::TrafficLight;
fn main() {
// קרא קלט עבור משכי הזמן
let mut red_input = String::new();
std::io::stdin().read_line(&mut red_input).expect("Failed to read line");
let red_duration: u32 = red_input.trim().parse().expect("Invalid number");
let mut yellow_input = String::new();
std::io::stdin().read_line(&mut yellow_input).expect("Failed to read line");
let yellow_duration: u32 = yellow_input.trim().parse().expect("Invalid number");
let mut green_input = String::new();
std::io::stdin().read_line(&mut green_input).expect("Failed to read line");
let green_duration: u32 = green_input.trim().parse().expect("Invalid number");
// TODO: צור מופעים של כל וריאנט של TrafficLight עם משכי הזמן שהוזנו
// TODO: קרא למתודה status עבור כל רמזור והדפס את התוצאה
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין