לולאת for משופרת
חלק מהיחידה יסודות במסלול ה-Rust של Coddy. שיעור 66 מתוך 75.
יש דרכים שונות לעבור על איברי מערך, הנה כמה מהן:
חשבו על המערך הבא:
let numbers = [1, 2, 3, 4, 5];איטרטור ישיר:
for num in numbers.iter() {} // ערכים: 1, 2, 3, 4, 5
אינדקס וערך:
for (index, value) in numbers.iter().enumerate() { } // ערכים: (0,1), (1,2), (2,3), (3,4), (4,5)
פרוסות בגודל מסוים:
for chunk in numbers.chunks(2) { } // ערכים: [1,2], [3,4], [5]כל מקטע הוא פרוסה, ולכן אפשר להשתמש בו בשיטות של פרוסות, למשל,
chunk.len()מחזירה את מספר האיברים במקטע. המקטע האחרון עשוי להיות קטן יותר אם המערך לא מתחלק באופן שווה.
אפשר גם לשרשר את .enumerate() אל .chunks() כדי לקבל גם אינדקס וגם את המקטע בו־זמנית:
for (i, chunk) in numbers.chunks(2).enumerate() { }
// ערכים: (0,[1,2]), (1,[3,4]), (2,[5])כאן, .chunks(2) יוצרת תחילה את הפרוסות, ואז .enumerate() עוטפת כל אחת מהן במונה, כך ש-i הוא האינדקס של המקטע ו-chunk היא הפרוסה.
איטרציה תוך שינוי:
for num in numbers.iter_mut() { *num *= 2; } // המערך הופך ל: [2, 4, 6, 8, 10]
אתגר
קלצרו תוכנית שמעבדת רשימת קניות עם פריטים והמחירים שלהם, ומציגה את הנתונים בדרכים שונות.
התוכנית צריכה:
- להדפיס את מספרו של כל פריט ואת מחירו (באמצעות
enumerate). יש לעצב כך:Item N: $Price(לדוגמה,Item 1: $2.75). - להדפיס את המחירים בזוגות (באמצעות
chunks) בתור "bundle deals". אם יש 2 פריטים בחבילה, יש להדפיס את הסכום:Bundle N: $Price1 + $Price2 = $Sum. אם יש בה רק פריט אחד, יש להדפיס:Bundle N: $Price. - להחיל הנחה של 10% על כל המחירים (באמצעות
iter_mut). - להדפיס את המחירים הסופיים לאחר ההנחה, כל אחד בשורה חדשה, בעיגול ל-2 ספרות אחרי הנקודה העשרונית (לדוגמה,
$2.48).
רמז: אפשר לשרשר איטרטורים, לדוגמה, prices.chunks(2).enumerate() נותן לכם גם את האינדקס של המקטע וגם את פרוסת המקטע בבת אחת. כל chunk הוא פרוסה, ולכן אפשר לקרוא לו עם chunk.len() ולגשת לאיברים שלו באמצעות אינדקס, למשל chunk[0], chunk[1] וכן הלאה.
פורמט הפלט הצפוי למחירים:
השתמשו ב-${:.2} כדי לעצב את המחירים עם 2 ספרות אחרי הנקודה העשרונית.
הטקסט המדויק הוא Bundle 4: $7.90.
נסו בעצמכם
fn main() {
let mut prices = [2.75, 1.50, 5.00, 3.5, 4.1, 2.25, 7.9];
println!("Original Prices:");
// TODO: השתמשו ב-enumerate() כדי להדפיס את המספר והמחיר של כל פריט
// רמז: prices.iter().enumerate() מחזיר זוגות של (index, &price)
// עצבו את המחירים עם 2 ספרות אחרי הנקודה העשרונית באמצעות {:.2}; הפורמט המדויק מופיע בהוראות
println!("\nBundle Deals:");
// TODO: שרשרו את chunks(2) ואת enumerate() יחד: prices.chunks(2).enumerate()
// כך מתקבלים זוגות של (index, chunk); כל chunk הוא פרוסה, ולכן chunk.len() מציין את גודלה
// אם chunk.len() == 2, הדפיסו: "Bundle 1: $2.75 + $1.50 = $4.25"
// אם chunk.len() == 1, הדפיסו את השורה של הפריט היחיד המתוארת בהוראות
// השתמשו ב-{:.2} כדי לעצב את כל המחירים עם 2 ספרות אחרי הנקודה העשרונית
// TODO: השתמשו ב-iter_mut() כדי להחיל הנחה של 10% discount על כל המחירים
// רמז: הכפילו כל *price ב-0.9
println!("\nPrices after 10% discount:");
// TODO: הדפיסו כל מחיר לאחר ההנחה עם 2 ספרות אחרי הנקודה העשרונית
// פורמט הפלט המצופה מוצג בהוראות
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגיים חלק 1אופרטורים לוגיים חלק 2חזרה – לוגיקה פשוטהאופרטורים לוגיים חלק 3תרגלו בעצמכם: קומפיילר Rust אונליין