Если что-то работает, но вы думаете, что не должно работать в настоящий момент, это может быть связано с одним из следующих.
Преобразования - ослабляет типы для соответствия сигнатуре, например, &mut T к &T, преобразования типов.
Разименования - разыменование x: T до \* x, \*\*x, … совместимы с некоторыми назначениями S.
Прелюдия - автоматический импорт основных элементов, например, Option, drop(),…
Одолжение - поскольку x: &mut T не может быть скопировано, перемещает в новый &mut \*x.
Время жизни - позволяет записать f(x: &T) вместо f<'a>(x: &'a T) для краткости.
Разрешения метода - разыменовывает или заимствует х до тех пор, пока не сработает x.f().
Сопоставления шаблонов - многократно отменяет проверку и добавляет к привязкам ref и ref mut.
Статическое повышение R-value - делает ссылки на статические константы, например, &42, &None, &mut \[\].
Двойные определения - определение одного (например, структуры S(u8)) неявно определяет другое (например, fn S).
Примечание: эти особенности облегчают вашу жизнь, используя Rust, но мешают ее усвоению. Если вы хотите развить подлинное понимание, потратьте дополнительное время на их изучение.