gpt4 book ai didi

rust - Rust中有多位引用读者和一位引用作家

转载 作者:行者123 更新时间:2023-12-03 11:39:52 26 4
gpt4 key购买 nike

我目前正在开发一个小型Rust游戏,从该语言开始,基本上具有以下代码(我在这里只写了一个最小的示例):

struct Player<'a> {
pub ship: &'a Ship<'a>,
}

impl<'a> Player<'a> {
pub fn run(&mut self) {
// Does some computing with self.ship.x/self.ship.y
}
}

struct Ship<'a> {
pub players: Vec<Player<'a>>,
pub x: f64,
pub y: f64,
}

impl<'a> Ship<'a> {
pub fn add_player(&mut self, player: Player<'a>) {
self.players.push(player);
}
}

fn main() {
let mut ship = Ship {
players: vec![],
x: 0.0,
y: 0.0,
};

// At some point create a player for the ship
let player = Player { ship: &ship };
ship.add_player(player); // <- Forbidden
}

这里最重要的是,所有 Player都可以使用不可变的引用访问其所属的飞船,从而可以轻松访问其飞船的位置(x/y)(随着游戏的运行,该位置会随着时间而变化) )。但是,此代码无法编译:
error[E0502]: cannot borrow `ship` as mutable because it is also borrowed as immutable
--> src/main.rs:32:5
|
31 | let player = Player { ship: &ship };
| ----- immutable borrow occurs here
32 | ship.add_player(player);
| ^^^^^----------^^^^^^^^
| | |
| | immutable borrow later used by call
| mutable borrow occurs here

我知道 player借用 ship是不可变的,并且在借用发生后我仍在尝试修改 ship,但是我找不到在这种情况下应该使用的正确的智能指针或包装器?您会使用 RwLock还是 RefCell或其他?

最佳答案

您的想法正确,因为您可能需要使用RefCell,RwLock甚至Rc。但是,这些概念更为高级,我不建议您在刚开始学习该语言时尝试使用它们。相反,我将从Player结构中删除Ship引用,只让Ship包含对Player的引用。

如果您还没有的话,我强烈推荐official rust book,它是该语言的绝佳介绍,并提供了许多示例!

关于rust - Rust中有多位引用读者和一位引用作家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61043888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com