Основы владения
Теперь, когда мы можем сконструировать список, было бы неплохо что-нибудь с ним сделать.
Делать будем при помощи «обычных» (не статических) методов.
Метод — это особый вид функции в Rust.
У него есть аргумент self без типа:
fn foo(self, arg2: Type2) -> ReturnType {
// тело
}
Есть три основные формы, которые он может принимать: self, &must self и &self.
Эти три формы представляют три основные формы владения в Rust:
self— Значение&mut self— изменяемая ссылка&self— разделяемая ссылка
Значение — это, по сути, истинное владение.
Вы можете делать со значением всё, что хотите: отдать, уничтожить, изменить или передавать по ссылке.
Если вы передаёте что-то по значению, оно отдаётся в новое место.
Новое место теперь владеет значением, а старое место больше не имеет к нему доступа.
По этой причине большинство методов не используют self — было бы довольно глупо работать со списком, теряя к нему доступ!
Изменяемая ссылка означает временный эксклюзивный доступ к значению, которым вы не владеете.
Вы можете делать со значением абсолютно всё, что хотите, если в конце вы оставляете его в рабочем состоянии (иное было бы невежливым по отношению к владельцу!).
Это значит, что на самом деле значение можно полностью перезаписать.
Очень полезный частный случай — обмен двух значений, который нам пригодится, и не единожды.
Единственное, что нельзя сделать с &mut — уничтожить, не заменив другим значением.
&mut self отлично подходит для методов, которым надо изменить self.
Разделяемое владение означает временный разделяемый доступ к значению, которым вы не владеете.
Имея разделяемый доступ, вы в общем случае ничего не можете изменить.
Как в музее: смотреть можно, руками трогать нельзя!
& отлично подходит для методов, которым self нужен только для чтения.
Позже мы узнаем, что правило об изменении в определённых случаях можно обойти. По этой причине разделяемые ссылки не называют неизменяемыми. Скорее, изменяемые ссылки можно было бы называть уникальными, но, как выяснило Rust-сообщество, связь между владением и изменяемостью интуитивно понятна в 99% случаев.