Есть много ответов на вопросы о 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...
}
}
Попытка скомпилировать немедленно приводит к ошибке:
ошибка [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
, и, таким образом, заимствован? Я что-то не вижу из-за синтаксического сахара?