Следует отметить, что термин mut
в Ржавчина горячо обсуждался до стабилизации, при этом некоторые утверждали, что его следует назвать excl
или uniq
. Дело в том, что mut
in в let mut x
и &mut x
- это две совершенно разные вещи.
let mut x
объявляет, что x
является изменяемым, в том смысле, что его можно переназначить но также и то, что можно взять &mut
ссылку на него; которая лучше всего называется исключительная или уникальная ссылка. В некоторых случаях в Rust вполне возможно мутировать с помощью shared ссылки, например, в случае std::cell::Cell
, и не все операции, требующие исключительной ссылки, связаны с мутацией. Операция, для которой требуется эксклюзивная ссылка, просто является небезопасной с общей; Cell
разработан таким образом, что это не так, строго контролируя, при каких условиях может происходить мутация.
Теоретически, две функции let mut x
могут иметь разные ключевые слова, но они сжаты в один для простоты. Rust теоретически может быть разработан с mut
и excl
, представляющими собой разные ключевые слова, и с учетом let excl x
, который будет переменной, из которой можно взять исключительную ссылку, но не мутировать.
Можно также иметь переменные, которые не объявлены с mut
, в частности, в вызовах функций. В такой сигнатуре, как fn func ( x : u32 )
, x не является изменяемым, но он является переменным, потому что каждый раз можно передавать различный x
.
Тип "1030 *" mutable является чисто lint и, теоретически, ненужные для Rust для работы - любая работающая в данный момент программа Rust продолжит работать, если все не изменяемые переменные станут изменяемыми. Это просто считается плохой практикой, и компилятор будет предупреждать программиста всякий раз, когда он делает переменную непостоянной, которая не обязательно должна быть изменяемой; это помогает ловить непреднамеренные ошибки. Это совершенно не относится к эксклюзивным и общим ссылкам, которые необходимо различать, а не просто линт.