Уроки модуля (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 ясно сообщает компилятору и всем, кто читает код, что значение будет меняться во время выполнения.
Слежение
Rust также допускает концепцию затенения, то есть повторного объявления переменной с тем же именем с использованием ключевого слова 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 попыток