【发布时间】:2015-02-09 20:20:55
【问题描述】:
我正在尝试学习 Rust,但我唯一要做的就是不断尝试将熟悉的(对我而言)Java 概念硬塞到它的类型系统中。或者尝试硬塞 Haskell 概念等。
我想编写一个包含Player 和许多Resources 的游戏。每个Resource 可以被一个Player 拥有:
struct Player {
points: i32,
}
struct Resource<'a> {
owner: Option<&'a Player>,
}
fn main() {
let mut player = Player { points: 0 };
let mut resources = Vec::new();
resources.push(Resource {
owner: Some(&player),
});
player.points = 30;
}
它没有编译,因为我不能让资源指向播放器,同时修改它:
error[E0506]: cannot assign to `player.points` because it is borrowed
--> src/main.rs:15:5
|
13 | owner: Some(&player),
| ------ borrow of `player.points` occurs here
14 | });
15 | player.points = 30;
| ^^^^^^^^^^^^^^^^^^ assignment to borrowed `player.points` occurs here
此外,如果Resource 拥有对Player 的可变引用,我什至不能拥有两个Resources 具有相同的所有者。
解决这种情况的 Rust 方法是什么?
我过于简单化了我的问题,虽然 Shepmaster 的答案是正确的答案,但这不是我想要得到的(因为我问的不是我真正想问的)。我会尝试改写它并添加更多上下文。
- 资源以某种方式连接 - 所有资源的地图 资源形成一个(无)有向图。
- 每个玩家可以拥有许多资源,每个资源可以由一个玩家拥有。玩家应该能够从他们拥有的资源中获得积分。我想到了这样的签名:
fn addPoints(&mut self, allResources: &ResourcesMap) -> ()。 - 玩家可以从其他玩家手中接管与他们的一个资源相连的资源。这可能会导致其他玩家失去一些分数。
问题:
- 如何在 Rust 中表示这样的图(可能是循环结构,其中每个节点都可以从多个节点指向)?
- 原问题:如果
Resource指向Player,我不能修改播放器!
Resources 指向Player 因为 - 执行此类操作的自然方法是从玩家 A 的一些资源开始,穿过地图移动到玩家 B 的资源,然后从该资源移动到玩家 B减去分数。这在 Rust 中似乎并不自然(至少对我而言)。
【问题讨论】:
标签: rust