Ровно четыре варианта для первого параметра метода в блоке impl
Есть ровно четыре варианта для первого параметра метода в блоке
impl. Выбор зависит от того, что метод делает с памятью структуры.Вот полная спецификация компилятора:
1.
&self — Разделяемое заимствование (Shared Borrow)- Синтаксис:
fn метод(&self) - Десугаринг:
self: &Self - Физика: Передаётся константный указатель. Объект можно только читать. Самый частый случай (геттеры, проверки состояния).
2.
&mut self — Изменяемое заимствование (Mutable Borrow)- Синтаксис:
fn метод(&mut self) - Десугаринг:
self: &mut Self - Физика: Передаётся мутабельный указатель. Эксклюзивный доступ. Позволяет изменять поля структуры. Пока метод работает, никто другой не может даже читать эту структуру.
3.
self — Передача владения (Потребление / Move)- Синтаксис:
fn метод(self) - Десугаринг:
self: Self - Физика: Структура передается по значению. Владение переходит внутрь метода. После вызова такого метода исходная переменная снаружи уничтожается (становится невалидной).
- Применение: Паттерн «Строитель» (Builder), конвертация одного типа в другой (например,
имя_структуры.into_bytes()), или финальная деструктуризация.
4. Отсутствие
self — Ассоциированная функция (Associated Function)- Синтаксис:
fn метод() - Физика: Обычная функция, у которой нет доступа к конкретному экземпляру структуры. Она просто привязана к пространству имен типа.
- Применение: Конструкторы (традиционно именуются
new), фабричные методы, утилиты. Вызываются через двоеточие:ИмяСтруктуры::метод().
Продвинутый уровень (Смарт-указатели)
Для полноты картины: первый параметр может быть обернут в смарт-указатель, например
self: Box<Self>, self: Rc<Self> или self: Arc<Self>. Это нужно, когда метод должен вызываться только тогда, когда структура уже лежит в куче или управляется счетчиком ссылок.sdmrnv [3.76ms]
