שרשור מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Rust של Coddy. שיעור 6 מתוך 61.
עד כה, המתודות הניתנות לשינוי שלנו שינו את המבנה ולא החזירו דבר. אבל מה אם נרצה לקרוא לכמה מתודות ברצף על אותו מופע? על ידי החזרת הפניה אל self, אנחנו מאפשרים שרשור מתודות: תבנית שבה כמה קריאות למתודות משתלבות בביטוי יחיד.
המפתח הוא לגרום למתודות &mut self שלך להחזיר &mut Self:
struct Config {
debug: bool,
timeout: u32,
}
impl Config {
fn new() -> Config {
Config { debug: false, timeout: 30 }
}
fn set_debug(&mut self, value: bool) -> &mut Self {
self.debug = value;
self
}
fn set_timeout(&mut self, seconds: u32) -> &mut Self {
self.timeout = seconds;
self
}
}
כל מתודה משנה את המבנה ואז מחזירה את self: הפניה ניתנת לשינוי בחזרה לאותו מופע. כך הקריאה הבאה למתודה יכולה להמשיך לעבוד עליו מיד:
fn main() {
let mut config = Config::new();
config.set_debug(true).set_timeout(60);
println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
// פלט: Debug: true, Timeout: 60
}
במקום לכתוב שלוש הצהרות נפרדות, אנחנו מגדירים הכול בשורה זורמת אחת. תבנית זו בסגנון ״builder״ שימושית במיוחד בעת הגדרת אובייקטים עם הגדרות אפשריות רבות, והופכת את הקוד שלך לתמציתי וקריא יותר.
אתגר
קלצרו מבנה TextStyle עם שלושה שדות: bold (bool), italic (bool) ו-size (u32).
הוסיפו בלוק מימוש עבור TextStyle עם הפריטים הבאים:
new: פונקציה משויכת שמחזירהTextStyleשבוboldמוגדר ל-false,italicמוגדר ל-falseו-sizeמוגדר ל-12set_bold: מקבלת&mut selfוערך מסוגbool, מגדירה את שדה ה-bold ומחזירה&mut Selfלשרשורset_italic: מקבלת&mut selfוערך מסוגbool, מגדירה את שדה ה-italic ומחזירה&mut Selfלשרשורset_size: מקבלת&mut selfוערך מסוגu32, מגדירה את שדה ה-size ומחזירה&mut Selfלשרשור
תקבלו שלוש קלטים:
- שורה ראשונה: הגדרת bold (
trueאוfalse) - שורה שנייה: הגדרת italic (
trueאוfalse) - שורה שלישית: גודל הגופן (u32)
צרו TextStyle שניתן לשינוי באמצעות new, ואז השתמשו בשרשור מתודות כדי להחיל את כל שלוש ההגדרות בביטוי אחד. הדפיסו את המצב הסופי בפורמט שמוצג למטה.
פורמט הפלט הצפוי:
Bold: {bold}, Italic: {italic}, Size: {size}נסו בעצמכם
use std::io;
// TODO: הגדר כאן את המבנה TextStyle
// TODO: הוסף בלוק מימוש עבור TextStyle הכולל:
// - פונקציה משויכת new()
// - מתודה set_bold()
// - מתודה set_italic()
// - מתודה set_size()
fn main() {
let mut input = String::new();
// קרא את הגדרת ההדגשה
io::stdin().read_line(&mut input).expect("Failed to read line");
let bold: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// קרא את הגדרת הכתב הנטוי
io::stdin().read_line(&mut input).expect("Failed to read line");
let italic: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// קרא את הגדרת הגודל
io::stdin().read_line(&mut input).expect("Failed to read line");
let size: u32 = input.trim().parse().expect("Invalid u32");
// TODO: צור TextStyle שניתן לשינוי באמצעות new(), ולאחר מכן שרשר מתודות
// כדי להחיל את כל שלוש ההגדרות בביטוי אחד
// TODO: הדפס את התוצאה בפורמט: Bold: {bold}, Italic: {italic}, Size: {size}
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1מתודות והתנהגות
מבוא לבלוקי מימושהפרמטר selfמתודות ניתנות לשינויפונקציות משויכותבלוקי מימוש מרוביםשרשור מתודותסיכום – פעולות מלבן4פרויקט: חיית מחמד וירטואלית
הגדרת חיית המחמדהאכלת חיית המחמדתרגלו בעצמכם: קומפיילר Rust אונליין