Перейти до основного вмісту
Модуль 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 чітко повідомляє компілятору та всім, хто читає код, що значення зміниться під час виконання.

Затінення

Rust також допускає концепцію затінення, яка є повторним оголошенням змінної з такою самою назвою за допомогою ключового слова 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, оголосивши її знову за допомогою дозволу, щоб помножити її попереднє значення на 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 спроб