Есть много ответов на вопросы о error[E0502]
Rust, но я не могу понять один конкретный случай. У меня есть struct
, и это impl
метод, который выглядит следующим образом:
struct Test {
test_vec: Vec<i32>,
}
impl Test {
// other methods...
fn test(&mut self) -> i32 {
self.test_vec.swap(0, self.test_vec.len() - 1);
// other operations...
}
}
Попытка скомпилировать, которая немедленно приводит к ошибке:
error [E0502]: невозможно заимствовать self.test_vec
как неизменяемый, потому что он также заимствован как изменяемый
self.test_vec.swap(0, self.test_vec.len() - 1);
------------- ---- ^^^^^^^^^^^^^ immutable borrow occurs here
| |
| mutable borrow later used by call
mutable borrow occurs here
Кто-нибудь может объяснить, почему? На самом деле это не похоже на то, что я пытаюсь заимствовать там self.test_vec
, я передаю результат типа usize
вызова len()
. С другой стороны:
fn test(&mut self) -> i32 {
let last_index = self.test_vec.len() - 1;
self.test_vec.swap(0, last_index);
// other operations...
}
Используя временную переменную, она работает, как ожидалось, заставляет меня думать, что вызов len()
каким-то образом оценивается после он достигает swap
, и таким образом будучи заимствованным? Я что-то не вижу из-за синтаксического сахара?