Извините, если это очень просто. Я изучаю ржавчину и привыкаю к странной системе заимствований. Обычно вы можете получить желаемое поведение, просто изменив синтаксис вызовов вашего метода, однако в этом случае, похоже, теперь есть способ.
Вот упрощенная версия моего кода: EventPump
если из SDL.
struct Example {
pump: EventPump
}
impl Example {
fn method(&mut self) {
for event in pump.poll_iter() {
self.other_method();
}
}
fn other_method(&self) {
}
}
Однако я получаю следующую ошибку:
error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable
--> src\game.rs:53:67
|
30 | for event in self.pump.poll_iter();
| ---------------------
| |
| mutable borrow occurs here
| mutable borrow later used here
...
53 | self.other_method();
| ^^^^ immutable borrow occurs here
Вероятно, есть какой-то правильный способ сделать это, чтобы моя структура могла сохранить право собственности на себя, но я не смог его найти.
Я пробовал следующее:
- Превратите его в цикл while с явным
while let event = iterator.next()
, та же ошибка - Делая функцию изменяемой, теперь в ошибке говорится, что две изменяемые ссылки также не допускаются. Я предполагаю, что вся часть сообщения об ошибке "неизменяемость" на самом деле не имеет значения.
Возможно, я мог бы скопировать все содержимое итератора в вектор или что-то в этом роде, но это нарушило бы цель итератора, а что, если итератор не конечный? Должен быть лучший способ ...
Если бы кто-то с большим опытом ржавчины мог мне помочь, я был бы очень признателен.