#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. … и это будет продолжаться как минимум несколько недель, поверьте мне 🙂 В конце концов, все щелкнет, и вы будете бороться с этим все меньше и меньше. Прошло некоторое время с тех пор, как мне приходилось сидеть сложа руки и действительно думать о том, что не так с написанным мной кодом. Доходит до того, что вы рассматриваете ошибки проверки заимствования как явно очевидные ошибки с вашей стороны, и вам будет удобно исправить это. Это просто занимает немного времени, вот и все.