Переменные и изменяемость
Как упоминалось в разделе "Сохранение значений в переменных", по умолчанию переменные неизменяемы. Это один из многих подсказок, которые Rust дает вам для написания кода таким образом, чтобы воспользоваться безопасностью и простотой параллелизма, которые предлагает Rust. Однако, вы по-прежнему имеете возможность сделать свои переменные изменяемыми. Давайте рассмотрим, как и почему Rust поощряет вас к неизменяемости и почему иногда вы можете захотеть отказаться от нее.
Когда переменная неизменяемая,一旦 значение привязано к имени, вы не можете изменить это значение. Чтобы проиллюстрировать это, создайте новый проект под названием variables в вашей директории project
с помощью команды cargo new variables
.
Затем, в вашей новой директории variables
, откройте src/main.rs
и замените его код следующим кодом, который еще не скомпилируется:
Имя файла: src/main.rs
fn main() {
let x = 5;
println!("The value of x is: {x}");
x = 6;
println!("The value of x is: {x}");
}
Сохраните и запустите программу с помощью cargo run
. Вы должны получить сообщение об ошибке, связанной с ошибкой неизменяемости, как показано в этом выводе:
$ cargo run
Compiling variables v0.1.0 (file:///projects/variables)
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:4:5
|
2 | let x = 5;
| -
| |
| first assignment to `x`
| help: consider making this binding mutable: `mut x`
3 | println!("The value of x is: {x}");
4 | x = 6;
| ^^^^^ cannot assign twice to immutable variable
Этот пример показывает, как компилятор помогает вам находить ошибки в ваших программах. Ошибки компилятора могут быть раздражающими, но на самом деле это означает только то, что ваша программа еще не безопасно делает то, что вы хотите, и не означает, что вы плохой программист! Опытные Rustaceans также получают ошибки компилятора.
Вы получили сообщение об ошибке cannot assign twice to immutable variable
x`, потому что вы пытались присвоить второе значение неизменной переменной
x`.
Важно, чтобы мы получали ошибки на этапе компиляции, когда пытаемся изменить значение, которое было объявлено неизменным, потому что именно эта ситуация может привести к ошибкам. Если одна часть нашего кода работает с предположением, что значение никогда не изменится, а другая часть нашего кода изменяет это значение, то возможно, что первая часть кода не будет делать то, что было задумано. Причина такого рода ошибки может быть трудно отследить позднее, особенно когда вторая часть кода изменяет значение только иногда. Rust компилятор гарантирует, что когда вы утверждаете, что значение не изменится, оно действительно не изменится, поэтому вы не должны следить за этим самостоятельно. Таким образом, ваш код легче понять.
Но изменяемость может быть очень полезной и может сделать код более удобным для написания. Хотя переменные по умолчанию неизменяемы, вы можете сделать их изменяемыми, добавив mut
перед именем переменной, как вы делали в главе 2. Добавление mut
также передаёт намерение будущим читателям кода, указывая, что другие части кода будут изменять значение этой переменной.
Например, давайте изменим src/main.rs
на следующее:
Имя файла: src/main.rs
fn main() {
let mut x = 5;
println!("The value of x is: {x}");
x = 6;
println!("The value of x is: {x}");
}
Теперь, когда мы запускаем программу, мы получаем следующий результат:
$ cargo run
Compiling variables v0.1.0 (file:///projects/variables)
Finished dev [unoptimized + debuginfo] target(s) in 0.30s
Running `target/debug/variables`
The value of x is: 5
The value of x is: 6
Мы можем изменить значение, привязанное к x
, с 5
на 6
, когда используется mut
. В конечном итоге решение о том, использовать изменяемость или нет, зависит от вас и зависит от того, что вы считаете наиболее понятным в данной ситуации.