В главе 3 книги Rust , Переменные и изменчивость , мы пройдем несколько итераций по этой теме, чтобы продемонстрировать неизменное поведение переменных по умолчанию в Rust:
fn main() {
let x = 5;
println!("The value of x is {}", x);
x = 6;
println!("The value of x is {}", x);
}
Какие выходы:
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:4:5
|
2 | let x = 5;
| -
| |
| first assignment to `x`
| help: make this binding mutable: `mut x`
3 | println!("The value of x is {}", x);
4 | x = 6;
| ^^^^^ cannot assign twice to immutable variable
Однако из-за того, что Rust принимает shadowing переменные, мы можем просто сделать это, чтобы изменить значение тем не менее "неизменного" x
:
fn main() {
let x = 5;
println!("The value of x is {}", x);
let x = 6;
println!("The value of x is {}", x);
}
Какие выходы (пропуская детали):
The value of x is 5
The value of x is 6
Как ни странно, этот код также выводит вышеуказанную пару строк в качестве вывода, несмотря на то, что мы не вызываем let
, но вместо этого mut
в первый раз x
связан с 5
:
fn main() {
let mut x = 5;
println!("The value of x is {}", x);
x = 6;
println!("The value of x is {}", x);
}
Эта неоднозначность того, как переменные (не реально) защищены от переназначения, кажется, противоречит заявленной цели защиты значений, связанных с неизменяемыми - по умолчанию переменными Rust. Из той же главы (которая также содержит раздел Shadowing ):
Важно, чтобы мы получали ошибки во время компиляции при попытке
изменить значение, которое мы ранее определили как неизменный, потому что это
Сама ситуация может привести к ошибкам. Если одна часть нашего кода работает на
предположение, что значение никогда не изменится, и другая часть нашего
код изменяет это значение, возможно, что первая часть кода
не будет делать то, что было задумано. Причина такого рода ошибки может
быть трудно выследить после факта, особенно когда второй
кусок кода меняет значение только иногда.
В Rust компилятор гарантирует, что при указании значения
не изменится, это действительно не изменится. Это означает, что когда вы
при чтении и написании кода вам не нужно отслеживать, как и
где значение может измениться. Ваш код, таким образом, легче рассуждать
через.
Если я могу заставить эту важную особенность моего неизменного x
обойти стороной достаточно невинный вызов let
, зачем мне нужен mut
? Есть ли способ действительно, серьезно вы, ребята, сделать x
неизменяемым, чтобы ни один let x
не мог переназначить его значение?