Доступ к различным полям одной и той же структуры одновременно и изменчиво
Я пытаюсь написать карточную игру на 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
Как я мог подойти к этой проблеме?