מקטעים כפרמטרים לפונקציות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 56 מתוך 66.
בעת כתיבת פונקציות שעובדות עם מחרוזות, שימוש ב-&str כסוג של פרמטר במקום ב-String הופך את הפונקציות שלך לגמישות ושימושיות הרבה יותר.
פונקציה שמקבלת פרמטר מסוג String יכולה לקבל רק מחרוזות בבעלותה, דבר שמגביל את האופן שבו אפשר לקרוא לה:
fn print_message(text: String) {
println!("{}", text);
}
// זה עובד, אבל מעביר את הבעלות
let my_string = String::from("Hello");
print_message(my_string); // לא ניתן עוד להשתמש ב-my_string לאחר מכןעם זאת, פונקציה שמקבלת &str יכולה לקבל גם הפניות ל־String וגם מחרוזות מילוליות, ולכן היא הרבה יותר רב־תכליתית:
fn print_message(text: &str) {
println!("{}", text);
}
// עכשיו אפשר לקרוא לה עם כל אחד משני הטיפוסים
let my_string = String::from("Hello");
print_message(&my_string); // העבירו הפניה ל-String
print_message("World"); // העבירו מחרוזת מילולית ישירותהגמישות הזאת פירושה שהפונקציות שלך פועלות במצבים רבים יותר, בלי לאלץ את מי שקוראים להן להמיר את הנתונים שלהם או לוותר על הבעלות עליהם.
אתגר
קלתקבלו שתי קלטים. הקלט הראשון הוא הודעת טקסט, והקלט השני הוא האורך המרבי המותר להודעה. צרו פונקציה בשם truncate_message שמקבלת פרוסת מחרוזת (&str) ואורך מרבי (usize) כפרמטרים. אם אורך ההודעה עולה על האורך המרבי, הפונקציה צריכה להחזיר פרוסה של ההודעה עד לאורך המרבי. אחרת, עליה להחזיר את ההודעה כולה. הדפיסו את התוצאה.
דרישות:
- קראו את הקלט הראשון (הודעת הטקסט) והסירו רווחים לבנים
- קראו את הקלט השני (האורך המרבי) והסירו רווחים לבנים
- נתחו את האורך המרבי ל-
usize - הגדירו פונקציה
truncate_messageשמקבלת שני פרמטרים:- פרוסת מחרוזת
&strעבור ההודעה usizeעבור האורך המרבי
- פרוסת מחרוזת
- בתוך הפונקציה, בדקו אם אורך ההודעה גדול מהאורך המרבי
- אם כן, החזירו פרוסה של ההודעה מהאינדקס 0 ועד האורך המרבי באמצעות
&message[0..max_len] - אם לא, החזירו את ההודעה כולה
- קראו לפונקציה עם הודעת הקלט והאורך המרבי
- הדפיסו את התוצאה שהוחזרה
קלט:
- שורה ראשונה: הודעת טקסט (לדוגמה,
Hello World from Rust) - שורה שנייה: אורך מרבי כמספר (לדוגמה,
11)
פלט:
- ההודעה המקוצרת אם היא חורגת מהאורך המרבי, או ההודעה המלאה אחרת
נסו בעצמכם
use std::io;
// TODO: הגדירו כאן את הפונקציה truncate_message
fn main() {
// קראו את הודעת הטקסט
let mut message = String::new();
io::stdin().read_line(&mut message).expect("Failed to read line");
let message = message.trim();
// קראו את האורך המרבי
let mut max_length_input = String::new();
io::stdin().read_line(&mut max_length_input).expect("Failed to read line");
let max_len: usize = max_length_input.trim().parse().expect("Invalid number");
// TODO: קראו לפונקציה truncate_message ושמרו את התוצאה
// TODO: הדפיסו את התוצאה
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1זרימת בקרה מתקדמת
ביטוי 'match'התאמה למספר ערכיםהתאמה לטווחיםביטוי 'if let'לולאות כביטוייםסיכום – מנתח פקודות פשוט4קיבוץ נתונים באמצעות מבנים
מהו מבנה?סקירה כללית על מבניםגישה לשדות במבנהמבנים הניתנים לשינוימבנים כפרמטרים של פונקציהמבני טופלסיכום – יצירת מבנה ספר7טיפול בשגיאות באמצעות 'Result'
מהו 'Result'?שימוש ב-'match' עם 'Result'is_ok() ו-is_err()קיצורי דרך: unwrap ו-expectאופרטור סימן השאלה '?'המרת מחרוזות למספריםסיכום - פונקציית חילוק בטוחה10Closures ופונקציות אנונימיות
מהו Closure?הגדרת Closure פשוטClosures עם פרמטריםלכידת הסביבהסיכום – Closure פשוט לחיבור2מבוא לווקטורים
מהו וקטור?יצירת וקטורהוספת איברים באמצעות pushגישה לאיברי וקטורמעבר על וקטורמעבר ניתן לשינויהסרת איבריםסיכום – מעקב בסיסי אחר ניקוד5זוגות מפתח-ערך באמצעות מפות גיבוב
מהי מפת גיבוב?יצירת מפת גיבובהוספת זוגות מפתח-ערךגישה לערכיםמעבר על מפת גיבובעדכון ערךהסרת זוגסיכום – מונה מילים6טיפול בהיעדר באמצעות 'Option'
מהו 'Option'?שימוש ב-'match' עם 'Option'is_some() ו-is_none()חילוץ ערך מתוך 'Option'המתודה expectהגדרת ברירת מחדל: unwrap_orסיכום – מציאת איבר9מקטעי מחרוזת ועוד
String לעומת &strיצירת מקטעי Stringמקטעים כפרמטרים לפונקציותמקטעים אחריםסיכום – מציאת המילה הראשונהתרגלו בעצמכם: קומפיילר Rust אונליין