не может заимствовать X как неизменяемый, потому что он также заимствован как изменяемый

#rust

#Ржавчина

Вопрос:

В простом игровом цикле я active_player указываю на один из объектов 2 player.

 let mut active_player = amp;mut self.player1;
loop {
     // do stuff with active_player

    println!("{} {}", self.player1.last_move(), self.player2.last_move());

    // Switch to next player
}
  

Проблема возникает, когда я пытаюсь прочитать self.player1.last_move() Я понимаю, почему я получаю ошибку, но я не знаю правильного шаблона для решения этой проблемы. Это тот случай, когда active_player должен быть Rc ?

Ответ №1:

Область изменяемого заимствования распространяется на все тело loop . Вот простое воспроизведение вашего выпуска.

Вы можете ограничить область изменяемого заимствования, переместив его в loop .. возможно, вот так:

 loop {
    {
        let mut active_player = amp;mut self.player1; // or perhaps self.get_active_player(); ?
        // ... do stuff with active_player ...
    }

    println!("{} {}", self.player1.last_move(), self.player2.last_move());

    // Switch to next player
}
  

Вот суть, которая исправляет это, как указано выше.

Комментарии:

1. Ну, идея в том, что первый раз в цикле active_player выполняется self.player1, в следующий раз это player2, затем возвращаемся к player1. Изменяя область active_player здесь, я теряю, кто был активным игроком, что необходимо для переключения на следующего игрока

2. Да, ваше решение будет работать. Я не пытался написать часть «переключиться на следующего игрока» до этого момента … которая столкнулась с проблемами при многократном заимствовании. Мне просто нужно будет отслеживать активного игрока с помощью целого числа или чего-то еще

3. Я полагаю, вы могли бы, возможно, перенести логику «получить активного игрока» в собственный метод. Не зная внутренних особенностей остальной части вашей игры, я не могу предложить, как вы могли бы это сделать.

4. О, вау, я сегодня медленно печатаю — я рад, что вы разобрались, и мой ответ был полезен.

5. … и это будет продолжаться как минимум несколько недель, поверьте мне 🙂 В конце концов, все щелкнет, и вы будете бороться с этим все меньше и меньше. Прошло некоторое время с тех пор, как мне приходилось сидеть сложа руки и действительно думать о том, что не так с написанным мной кодом. Доходит до того, что вы рассматриваете ошибки проверки заимствования как явно очевидные ошибки с вашей стороны, и вам будет удобно исправить это. Это просто занимает немного времени, вот и все.