Я пытаюсь понять модель собственности Руста. Я пытаюсь передать ссылку на содержащий объект при вызове функции в структуре.
Вот моя структура:
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 как изменяемый.