我正在尝试理解 Rust 的所有权模型。我试图在结构体上调用函数时传递对包含对象的引用。
这是我的结构:
pub struct Player {}
impl Player {
pub fn receive(self, app: &App) {
}
}
如你看到的,receive
期望引用一个App
object.
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
inside Player
,因为这会导致双链结构。但我应该能够借用一个引用并对其执行操作,不是吗?
我在官方教程中没有找到答案。
我通过解决了它self
作为参考receive
。但如果我想要怎么办app
可变的receive
?我无法通过self
作为可变的sender
因为我也在借player
作为可变的。
一种遵循方式谢普大师的解决方案 https://stackoverflow.com/a/36940054/155423
脱离关系player
from self
在调用该方法之前。
就是把player
in an Option https://doc.rust-lang.org/stable/std/option/index.html:
impl App {
pub fn sender(&mut self) {
let mut player = self.player.take();
player.receive(&mut self);
self.player = Some(player);
}
}
最后一个资源是使用RefCell https://doc.rust-lang.org/stable/std/cell/struct.RefCell.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)