מקטעים אחרים
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 57 מתוך 66.
אף שפרוסות מחרוזת שימושיות מאוד, חיתוך לפרוסות אינו מוגבל למחרוזות בלבד. מושג הפרוסות של Rust חל על כל רצף של איברים, והופך אותו לכלי רב־עוצמה לעבודה עם אוספים בלי לקחת עליהם בעלות.
אפשר ליצור פרוסות ממערכים ומווקטורים באמצעות אותה תחביר שלמדת עבור מחרוזות. לדוגמה, אם יש לך מערך של מספרים, אפשר ליצור פרוסה שמפנה לחלק ממנו או לכולו:
let numbers = [1, 2, 3, 4, 5];
let slice: &[i32] = &numbers[1..4]; // כך נקבל את [2, 3, 4]
let full_slice: &[i32] = &numbers; // זה מפנה למערך כולואותו עיקרון עובד גם עם וקטורים. אפשר ליצור פרוסות מווקטורים כדי לעבוד עם חלקים מהנתונים בלי להזיז או להעתיק אותם:
let mut vec = vec![10, 20, 30, 40];
let vec_slice: &[i32] = &vec[0..2]; // זה נותן לנו [10, 20]אתגר
קליתקבלו שלוש קלטים. הקלט הראשון הוא רשימת מספרים המופרדים בפסיקים. הקלט השני הוא שני מספרים המופרדים ברווח ומייצגים את אינדקס ההתחלה ואת אינדקס הסיום ליצירת פרוסה. הקלט השלישי הוא מספר יחיד המייצג אינדקס לגישה מתוך הפרוסה.
יש ליצור וקטור מהמספרים המופרדים בפסיקים, ואז ליצור פרוסה באמצעות הטווח שצוין. יש לגשת לאיבר באינדקס הנתון מתוך הפרוסה ולהדפיס אותו.
דרישות:
- יש לקרוא את הקלט הראשון (מספרים המופרדים בפסיקים) ולהסיר רווחים לבנים
- יש לפצל את הקלט לפי פסיקים ולנתח כל מספר כ-
i32 - יש ליצור וקטור מהמספרים האלה
- יש לקרוא את הקלט השני (שני מספרים המופרדים ברווח) ולהסיר רווחים לבנים
- יש לפצל את הקלט השני לפי רווח כדי לקבל את אינדקס ההתחלה ואת אינדקס הסיום
- יש לנתח את שני האינדקסים כ-
usize - יש ליצור פרוסה מהווקטור באמצעות תחביר הטווח
&vec[start..end] - יש לקרוא את הקלט השלישי (האינדקס שאליו יש לגשת) ולהסיר רווחים לבנים
- יש לנתח את האינדקס כ-
usize - יש לגשת לאיבר באינדקס שצוין מתוך הפרוסה
- יש להדפיס את האיבר שאליו ניגשו
קלט:
- שורה ראשונה: מספרים המופרדים בפסיקים (לדוגמה,
10,20,30,40,50) - שורה שנייה: שני מספרים המופרדים ברווח (לדוגמה,
1 4) - שורה שלישית: מספר אינדקס (לדוגמה,
2)
פלט:
- האיבר באינדקס שצוין מתוך הפרוסה
נסו בעצמכם
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// קרא את הקלט הראשון (מספרים מופרדים בפסיקים)
let first_input = lines.next().unwrap().unwrap();
// קרא את הקלט השני (אינדקסי ההתחלה והסיום)
let second_input = lines.next().unwrap().unwrap();
// קרא את הקלט השלישי (האינדקס שאליו יש לגשת)
let third_input = lines.next().unwrap().unwrap();
// TODO: כתוב את הקוד שלך למטה
// נתח את המספרים המופרדים בפסיקים וצור וקטור
// נתח את אינדקסי ההתחלה והסיום
// צור פרוסה מהווקטור
// גש לאיבר באינדקס שצוין מתוך הפרוסה
// הדפס את התוצאה
// println!("{}", result);
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
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 אונליין