דילוג לתוכן המרכזי
מודול 1 · שיעור 1 מתוך 21/14 בקורס~10 min
שיעורי מודול (1/2)

משתנים והשתנות

ב-Rust, ניהול משתנים וזיכרון מונחה על ידי שני עקרונות יסוד: בטיחות ושליטה. מסיבה זו, בניגוד לשפות תכנות רבות אחרות, משתנים ב-Rust הם בלתי ניתנים לשינוי כברירת מחדל.

המשמעות היא שברגע שערך מוקצה למשתנה, לא ניתן לשנותו. אם תנסה לשנות אותו, המהדר יעלה שגיאה.

משתנים בלתי ניתנים לשינוי ומילת המפתח mut

כדי להצהיר על משתנה, אנו משתמשים במילת המפתח let:

Rust
let x = 5; // Immutable by default
// x = 6; // ERROR! The compiler will refuse to build this code.

אם אתה צריך לשנות את הערך של משתנה, עליך להפוך אותו לשינוי במפורש באמצעות מילת המפתח mut מיד אחרי let:

Rust
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 שוב. המשתנה החדש "צללים" (או מכסה) את הקודם:

Rust
let x = 5;
let x = x + 1; // Shadowing: x is now 6
let x = x * 2; // Shadowing: x is now 12

שלא כמו mut, הצללה מאפשרת לך:

  1. שנה את סוג הנתונים של משתנה תוך שמירה על אותו שם.
  2. לשמור על חוסר השינוי של המשתנה לאחר התמורות.
Rust
let spaces = "   "; // Type: &str (string)
let spaces = spaces.len(); // Type: usize (number)

שימושיות של הצללה והיקפים

הצללה אינה מוגבלת לאותו בלוק; ניתן להשתמש בו בתוך בלוקים מקוננים ({}) כדי לעקוף זמנית ערך. כאשר הבלוק הפנימי מסתיים, המשתנה המקורי הופך להיות גלוי שוב:

Rust
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

מנגנון זה בטוח ויעיל במיוחד מכיוון שהוא מתרחש לחלוטין בזמן ההידור, ומבטיח בטיחות מסוג ללא תקורה של ביצועי זמן ריצה.


נסה זאת בעצמך

פעילות גופנית#rust.m1.l1.e1
ניסיונות: 0טוען...

הכריז על משתנה בר שינוי בשם x עם ערך התחלתי של 5. לאחר מכן, הוסף 10 ל-x והדפיס אותו למסך באמצעות ה-println! מאקרו.

טוען עורך...
הצג רמז

הכריז על המשתנה באמצעות `let mut x = 5;`, ולאחר מכן הגדל אותו עם `x += 10;` (או `x = x + 10;`) ולבסוף הדפיס אותו עם `println!('{}', x);`.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#rust.m1.l1.e2
ניסיונות: 0טוען...

הכריז על משתנה בלתי משתנה 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 ניסיונות

פעילות גופנית#rust.m1.l1.e3
ניסיונות: 0טוען...

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 ניסיונות