Почему изменение переменной без mut не вызывает ошибку изменчивости?

Я читал раздел Области действия и затенение книги Rust By Example и запутался в изменчивости переменных. В этом примере есть переменная, определенная со значением 1.

let long_lived_binding = 1;

Позже он был изменен на

let long_lived_binding = 'a';

Насколько я понимаю, если вы хотите изменить переменную, вам нужно поставить перед ней ключевое слово mut. Например, let mut long_lived_binding = 1; Почему данный пример в Rust By Example не выдает ошибку изменчивости?


person Desert Digital    schedule 18.01.2018    source источник
comment
Может быть, не точная копия, но может быть достаточно близко?   -  person loganfsmyth    schedule 18.01.2018
comment
Я согласен, что вопрос о перепривязке уже отвечает на это. Но для OP короткая версия заключается в том, что второй 'let' не изменяет первую переменную, а вместо этого создает новую переменную с тем же именем, что не мешает изменчивости.   -  person MutantOctopus    schedule 18.01.2018
comment
Действительно, и в качестве примера: play.rust-lang.org/   -  person loganfsmyth    schedule 18.01.2018


Ответы (2)


Изменяемость предотвращает изменение переменной, но не мешает вам вводить переменную с тем же именем, используя let. Разница тонкая, но заметная. Затенение может изменить тип значения. Изменчивость не может.

Затенение:

let x = 2;
let x = "String";

Изменчивость:

let x = 2;
x = 3; // will not compile because the variable that's immutable was assigned twice.

let mut x = 2;
x = 3;
x = "String"; // will not compile because you changed the type.

ссылка на игровую площадку

person Daniel Fath    schedule 18.01.2018

1-я переменная затеняется 2-й. Ржавчина это позволяет. Это как если бы вы определили 2 разные переменные с разными именами.

person アレックス    schedule 18.01.2018