У меня возникла проблема с некоторым кодом Rust, где мне разрешено брать что-то как изменчивое более одного раза на определенные условия (первая запутанная часть), но не другие.Rust Borrow checker только жалуется на заимствование как изменяемое несколько раз, когда функция, возвращающая ссылку с тем же назначением жизни, назначается
Я написал следующий пример для иллюстрации: (Playground)
struct NoLifetime {}
struct WithLifetime <'a> {
pub field: &'a i32
}
fn main() {
let mut some_val = NoLifetime {};
borrow_mut_function(&mut some_val);
borrow_mut_function(&mut some_val); // Borrowing as mutable for the second time.
let num = 5;
let mut life_val = WithLifetime { field: &num };
borrow_lifetime(&mut life_val);
borrow_lifetime(&mut life_val); // Borrowing as mutable for the second time.
let num_again = borrow_lifetime(&mut life_val); // Borrow, assign lifetime result
borrow_lifetime(&mut life_val); // Compiler: cannot borrow `life_val` as mutable more than once
}
fn borrow_mut_function(val_in: &mut NoLifetime) -> String {
"abc".to_string()
}
fn borrow_lifetime<'a>(val_in: &'a mut WithLifetime) -> &'a i32 {
val_in.field
}
Если вы видите, я могу взять как some_val
и life_val
изменяемым более чем один раз. Однако после присвоения возвращаемого значения borrow_lifetime
я больше не могу брать взаймы.
Моих вопросов следующие:
- От «правил» о привлечении в Rust Book, я должен иметь «ровно один изменяемую ссылку» в области применения на ту же величину. Однако в приведенном выше коде я заимствую как изменяемый каждый раз, когда я вызываю функцию
borrow_
. - Почему один и тот же тип заимствований не допускается, когда у меня есть функция, которая возвращает что-то с тем же временем жизни, что и параметр, и я назначаю этот параметр.
Любая помощь будет оценена по достоинству. Я представляю, что происходит здесь, что я не понимаю, что означает «заимствование как изменчивое», и когда нужно определить, что что-то заимствовано как изменчивое.