לכידת הסביבה
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 62 מתוך 66.
אחת התכונות העוצמתיות ביותר של סגירות היא היכולת שלהן ללכוד משתנים מהסביבה שלהן ולהשתמש בהם. בניגוד לפונקציות רגילות, סגירות יכולות "לראות" ולגשת למשתנים שקיימים באותו תחום שבו הן מוגדרות.
כך פועל לכידת הסביבה:
fn main() {
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // זה ידפיס "The value of x is: 10"
}בדוגמה הזו, הסגירה לוכדת את המשתנה x מהתחום שסביבה ומשתמשת בו בגוף שלה. אין צורך להעביר את x כפרמטר לסגירה — יש לה גישה אליו באופן אוטומטי.
אפשר גם ללכוד משתנים ולהשתמש בהם בחישובים:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // התוצאה היא 15אתגר
קלתקבלו שתי קלטים. הקלט הראשון הוא מספר שמייצג מחיר בסיס. הקלט השני הוא מספר שמייצג אחוז הנחה. צרו closure שלוכד את אחוז ההנחה מהסביבה ומחשב את המחיר הסופי לאחר החלת ההנחה. קראו ל-closure עם מחיר הבסיס והדפיסו את המחיר הסופי.
דרישות:
- קראו את הקלט הראשון (מחיר בסיס) והסירו רווחים לבנים
- נתחו אותו ל-
f64 - קראו את הקלט השני (אחוז הנחה) והסירו רווחים לבנים
- נתחו אותו ל-
f64 - צרו closure שמקבל פרמטר אחד (מחיר הבסיס) ולוכד את אחוז ההנחה מהסביבה המקיפה
- ה-closure צריך לחשב את המחיר הסופי באמצעות הנוסחה:
base_price - (base_price * discount / 100.0) - קראו ל-closure עם מחיר הבסיס
- הדפיסו את המחיר הסופי
קלט:
- שורה ראשונה: מחיר בסיס (לדוגמה,
100.0) - שורה שנייה: אחוז הנחה (לדוגמה,
20.0)
פלט:
- המחיר הסופי לאחר החלת ההנחה
נסו בעצמכם
use std::io;
fn main() {
// קרא את המחיר הבסיסי
let mut base_price_input = String::new();
io::stdin().read_line(&mut base_price_input).expect("Failed to read line");
let base_price: f64 = base_price_input.trim().parse().expect("Invalid number");
// קרא את אחוז ההנחה
let mut discount_input = String::new();
io::stdin().read_line(&mut discount_input).expect("Failed to read line");
let discount: f64 = discount_input.trim().parse().expect("Invalid number");
// TODO: צור closure שלוכד את ההנחה ומחשב את המחיר הסופי
// TODO: קרא ל-closure עם המחיר הבסיסי
// הדפס את המחיר הסופי
// println!("{}", final_price);
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1זרימת בקרה מתקדמת
ביטוי 'match'התאמה למספר ערכיםהתאמה לטווחיםביטוי 'if let'לולאות כביטוייםסיכום – מנתח פקודות פשוט4קיבוץ נתונים באמצעות מבנים
מהו מבנה?סקירה כללית על מבניםגישה לשדות במבנהמבנים הניתנים לשינוימבנים כפרמטרים של פונקציהמבני טופלסיכום – יצירת מבנה ספר7טיפול בשגיאות באמצעות 'Result'
מהו 'Result'?שימוש ב-'match' עם 'Result'is_ok() ו-is_err()קיצורי דרך: unwrap ו-expectאופרטור סימן השאלה '?'המרת מחרוזות למספריםסיכום - פונקציית חילוק בטוחה10Closures ופונקציות אנונימיות
מהו Closure?הגדרת Closure פשוטClosures עם פרמטריםלכידת הסביבהסיכום – Closure פשוט לחיבור2מבוא לווקטורים
מהו וקטור?יצירת וקטורהוספת איברים באמצעות pushגישה לאיברי וקטורמעבר על וקטורמעבר ניתן לשינויהסרת איבריםסיכום – מעקב בסיסי אחר ניקוד5זוגות מפתח-ערך באמצעות מפות גיבוב
מהי מפת גיבוב?יצירת מפת גיבובהוספת זוגות מפתח-ערךגישה לערכיםמעבר על מפת גיבובעדכון ערךהסרת זוגסיכום – מונה מיליםתרגלו בעצמכם: קומפיילר Rust אונליין