Проблема в том, что собственные переменные, предназначенные для прямой изменчивости, должны быть непостоянно связаны.
Когда вы объявляете переменную или аргумент функции, это может быть объединено как объявление привязки значения для некоторого имени - либо с ключевым словом let
, либо со списком аргументов в квадратных скобках. Эта привязка может быть изменяемой или неизменной, в зависимости от наличия или отсутствия ключевого слова mut
.
Если вы объявите привязку как неизменную, т.е. пропустите ключевое слово mut
, компилятор заявляет, что вы не получитеуникальная ссылка на него (и, следовательно, не будет изменять значение, по модулю любых UnsafeCell
s внутри него). Поэтому, если вы пытаетесь получить &mut
ссылку на него, это ошибка.
Чтобы исправить ошибку, вы можете либо перепривязать переменную, изменяя, эффективно отбрасывая предыдущую привязку (если значение равноне Copy
), или связывайте его с первого взгляда - так как это часть привязки, а не объявления переменной, ее можно использовать как в объявлении функции, так и в операторе let
.