this post was submitted on 25 Mar 2024
8 points (100.0% liked)

Rust

6032 readers
2 users here now

Welcome to the Rust community! This is a place to discuss about the Rust programming language.

Wormhole

[email protected]

Credits

  • The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)

founded 1 year ago
MODERATORS
 

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 are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 7 points 8 months ago (1 children)

You could store the matches in a HashMap as well, using some MatchId type as the key, i.e., HashMap<MatchId, Match>. Then you can use that as the reference in players: HashMap<String, MatchID>. Only downside is that you have to generate unique MatchIds, e.g., by using some counter.

[–] 5C5C5C 9 points 8 months ago (1 children)

This is exactly the use case that slotmap is meant for. I highly recommend using the library rather than reinventing the concept.

[–] [email protected] 2 points 8 months ago

Ah, that does seem like it will solve the problem. Thanks!