I have a struct that looks like this:
pub struct Game {
/// A HashSet with the players waiting to play as account strings.
lobby: HashSet<String>,
/// capacity determines how many people a match contains.
capacity: u8,
/// A vector of ongoing matches.
matches: Vec<Match>,
/// HashSet indicating for each player which match they are in.
players: HashMap<String, usize>,
}
I realised that this won’t work because if there are 3 matches (0, 1, 2) and I remove 1 because it ends, the players that used to point at 2 will be pointing outside the vector or to an incorrect match.
So I thought the obvious solution was to use a reference to the match: players: HashMap<String, &Match>. But this makes lifetimes very complicated.
What’s a good way to deal with a case like these where data are interrelated in the same struct?
You could store the matches in a
HashMap
as well, using someMatchId
type as the key, i.e.,HashMap
. Then you can use that as the reference inplayers: HashMap
. Only downside is that you have to generate uniqueMatchId
s, e.g., by using some counter.This is exactly the use case that slotmap is meant for. I highly recommend using the library rather than reinventing the concept.
Ah, that does seem like it will solve the problem. Thanks!