I'm trying to learn Rust, but the only thing I do is keep hitting the wall trying to shoehorn familiar (to me) Java concepts into its type system. Or try to shoehorn Haskell concepts, etc.
I want to write a game with a Player
and many Resource
s. Each Resource
can be owned by one 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;
}
It doesn't compile, because I can't have the resource point to player, while at the same time modifying it:
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
Moreover, if the Resource
owned a mutable reference to Player
, I couldn't even have two Resource
s with the same owner.
What is the Rust way to solve such cases?
I oversimplified my question, and while Shepmaster's answer is a correct answer to it, it's not what I wanted to get (because what I asked was not what I really wanted to ask). I'll try to rephrase it and add more context.
- The resources are connected in some way - the map of all
resources forms a (un)directed graph.
- Each player can own many resources, each resource can be owned by one player. The player should be able to get points from resources they own. I thought of a signature like:
fn addPoints(&mut self, allResources: &ResourcesMap) -> ()
.
- The player can take over a resource connected to one of their resources from another player. It could result in some points loss for the other player.
Problems:
- How to represent such graph in Rust (a possibly cyclic structure, where each node can be pointed to from many nodes)?
- The original problem: if the
Resource
points to a Player
, I can't modify the player!
Resource
s point to Player
because - the natural way to do such an operation would be to start from some of Player A's resources, move through the map to a player's B resource and from that resource to player B to subtract the points. It just doesn't seem natural in Rust (at least for me).
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…