Доступ к разным полям одной и той же структуры одновременно и изменчиво [дубликаты]

Я пытаюсь написать карточную игру на Rust, но столкнулся с проблемой проверки заимствований. Мой основной struct — это Game, который выглядит так

struct Game {
    players: HashMap<String, Player>,
    deck: Vec<Card>,
}

Плеер что-то вроде

struct Player {
    hand: Vec<Card>,
}

и для простоты можно предположить, что Card выглядит как

struct Card {
    text: String,
}

Теперь, естественно, я хотел бы взять карты из Game.deck

impl Game {
    fn draw_cards(&mut self, num: usize) -> Option<Vec<Card>> {
        if self.deck.len() >= num {
            let mut cards: Vec<Card> = Vec::new();
            for _ in 0..num {
                cards.push(self.deck.pop().unwrap());
            }
            Some(cards)
        } else {
            None
        }
    }
}

и добавить их в руку игрока

impl Game {
    fn draw_to_player(&mut self, name: &String, num: usize) -> Result<(), ()> {
        let cards = self.draw_cards(num);
        match cards {
            Some(mut cards) => {
                let player = self.players.get_mut(name);
                match player {
                    Some(player) => {
                        player.hand.append(&mut cards);
                        Ok(())
                    },
                    None => Err(()),
                }
            },
            None => Err(()),
        }
}

Полный пример игровой площадки

До этого момента все работает вполне нормально. При запуске игры я хочу перебрать всех игроков и позволить им нарисовать свою стартовую руку:

fn draw_for_all(&mut self) {
    for name in self.players.keys() {
        self.draw_to_player(name, 2);
    }
}

Полный пример игровой площадки

Это не работает, так как self заимствуется при переборе ключей, но для вызова draw_to_player его необходимо заимствовать изменчиво:

error[E0502]: cannot borrow `*self` as mutable because `self.players` is also borrowed as immutable
  --> src/main.rs:48:13
   |
47 |         for name in self.players.keys() {
   |                     ------------ immutable borrow occurs here
48 |             self.draw_to_player(name, 2);
   |             ^^^^ mutable borrow occurs here
49 |         }
   |         - immutable borrow ends here

Как я мог подойти к этой проблеме?


person red_trumpet    schedule 29.08.2017    source источник
comment
Попробуйте внутреннюю изменчивость :-), Может быть, используйте RefCell? Мысли вслух...   -  person Malice    schedule 29.08.2017