Я пытаюсь понять модель собственности Руста. Я пытаюсь передать ссылку на содержащий объект при вызове функции в структуре.
Вот моя структура:
pub struct Player {}
impl Player {
pub fn receive(self, app: &App) {
}
}
Как видите, receive
ожидает ссылку на объект App
.
pub struct App {
pub player: Player,
}
impl App {
pub fn sender(self) {
// how to call player.test() and pass self as a reference?
self.player.receive(&self);
}
}
Приведенный выше код дает мне «использование частично перемещенного значения: self
». Это имеет смысл, потому что App
имеет семантику перемещения, поэтому значение было перемещено в функцию sender
при ее вызове.
Если я изменю его так, чтобы sender
вместо этого принимал ссылку на self
, я получаю «невозможно выйти из заимствованного содержимого», что также имеет смысл, потому что мы заимствовали ссылку на self
, когда перешли в функцию sender
.
Так что же мне делать? Я понимаю, почему я не могу сохранить ссылку на App
внутри Player
, поскольку это привело бы к двусвязной структуре. Но я должен иметь возможность заимствовать ссылку и выполнять с ней операции, не так ли?
Я не нашел ответа в официальном руководстве.
Я решил это, передав self
в качестве ссылки в receive
. Но что, если я хочу, чтобы app
был изменяемым в receive
? Я не могу передать self
как изменяемый в sender
, потому что я также заимствую player
как изменяемый.