שיעורי מודול (1/2)
משתנים והשתנות
ב-Rust, ניהול משתנים וזיכרון מונחה על ידי שני עקרונות יסוד: בטיחות ושליטה. מסיבה זו, בניגוד לשפות תכנות רבות אחרות, משתנים ב-Rust הם בלתי ניתנים לשינוי כברירת מחדל.
המשמעות היא שברגע שערך מוקצה למשתנה, לא ניתן לשנותו. אם תנסה לשנות אותו, המהדר יעלה שגיאה.
משתנים בלתי ניתנים לשינוי ומילת המפתח mut
כדי להצהיר על משתנה, אנו משתמשים במילת המפתח let:
let x = 5; // Immutable by default
// x = 6; // ERROR! The compiler will refuse to build this code.אם אתה צריך לשנות את הערך של משתנה, עליך להפוך אותו לשינוי במפורש באמצעות מילת המפתח mut מיד אחרי let:
let mut y = 10; // Mutable
println!("Il valore di y e: {}", y);
y = 15; // Valid!
println!("Il valore modificato di y e: {}", y);שימוש בקידומת mut מתקשר בבירור למהדר ולכל מי שקורא את הקוד שהערך ישתנה במהלך הביצוע.
הַצלָלָה
חלודה מאפשרת גם את המושג הצללה, שהוא הצהרה מחדש של משתנה בעל אותו שם באמצעות מילת המפתח let שוב. המשתנה החדש "צללים" (או מכסה) את הקודם:
let x = 5;
let x = x + 1; // Shadowing: x is now 6
let x = x * 2; // Shadowing: x is now 12שלא כמו mut, הצללה מאפשרת לך:
- שנה את סוג הנתונים של משתנה תוך שמירה על אותו שם.
- לשמור על חוסר השינוי של המשתנה לאחר התמורות.
let spaces = " "; // Type: &str (string)
let spaces = spaces.len(); // Type: usize (number)שימושיות של הצללה והיקפים
הצללה אינה מוגבלת לאותו בלוק; ניתן להשתמש בו בתוך בלוקים מקוננים ({}) כדי לעקוף זמנית ערך. כאשר הבלוק הפנימי מסתיים, המשתנה המקורי הופך להיות גלוי שוב:
let x = 5;
{
let x = x * 2; // Shadowing valid only inside the block
println!("Value in the inner block: {}", x); // Prints 10
}
println!("Value in the outer block: {}", x); // Prints 5מנגנון זה בטוח ויעיל במיוחד מכיוון שהוא מתרחש לחלוטין בזמן ההידור, ומבטיח בטיחות מסוג ללא תקורה של ביצועי זמן ריצה.
נסה זאת בעצמך
הכריז על משתנה בר שינוי בשם x עם ערך התחלתי של 5. לאחר מכן, הוסף 10 ל-x והדפיס אותו למסך באמצעות ה-println! מאקרו.
הצג רמז
הכריז על המשתנה באמצעות `let mut x = 5;`, ולאחר מכן הגדל אותו עם `x += 10;` (או `x = x + 10;`) ולבסוף הדפיס אותו עם `println!('{}', x);`.
הפתרון זמין לאחר 3 ניסיונות
הכריז על משתנה בלתי משתנה y עם ערך של 10. הצל y על ידי הכרזה שוב עם let כדי להכפיל את הערך הקודם שלו ב-2, ולבסוף להדפיס אותו באמצעות println!.
הצג רמז
Use `let y = 10;`, then shadow it by declaring it again with `let y = y * 2;` and finally use `println!` to display it.
הפתרון זמין לאחר 3 ניסיונות
Declare an immutable variable named input containing the string value "42". Shadow input by declaring it as an integer of type i32, converting the original value via input.parse::<i32>().unwrap(). Finally, print it using the println! macro.
הצג רמז
Declare `let input = "42";`, then shadow it with `let input: i32 = input.parse().unwrap();` and print it using `println!("{}", input);`.
הפתרון זמין לאחר 3 ניסיונות