Menu
Coddy logo textTech

שרשור מתודות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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״ שימושית במיוחד בעת הגדרת אובייקטים עם הגדרות אפשריות רבות, והופכת את הקוד שלך לתמציתי וקריא יותר.

challenge icon

אתגר

קל

צרו מבנה TextStyle עם שלושה שדות: bold (bool), italic (bool) ו-size (u32).

הוסיפו בלוק מימוש עבור TextStyle עם הפריטים הבאים:

  • new: פונקציה משויכת שמחזירה TextStyle שבו bold מוגדר ל-false, italic מוגדר ל-false ו-size מוגדר ל-12
  • set_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}
    
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Rust אונליין