Перейти к основному содержимому
Модуль 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, объявив ее снова с помощью 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 попыток