У меня этот минимальный пример кода:
use std::borrow::BorrowMut;
trait Foo {}
struct Bar;
impl Foo for Bar {}
fn main() {
let mut encryptor: Box<Foo> = Box::new(Bar);
encrypt(encryptor.borrow_mut());
}
fn encrypt(encryptor: &mut Foo) { }
но с этой ошибкой не получается:
error: `encryptor` does not live long enough
--> src/main.rs:11:1
|
10 | encrypt(encryptor.borrow_mut());
| --------- borrow occurs here
11 | }
| ^ `encryptor` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created
Добрые люди в #rustbeginners обнаружили, что мне нужно разыменовать поле, чтобы получить содержимое, а затем заимствовать содержимое. Как это:
trait Foo {}
struct Bar;
impl Foo for Bar {}
fn main() {
let mut encryptor: Box<Foo> = Box::new(Bar);
encrypt(&mut *encryptor);
}
fn encrypt(encryptor: &mut Foo) { }
Это работает, но я этого не понимаю.
Почему мне нужно сначала разыменовать? Какая ошибка пытается сказать? Обычно это не ошибка, когда значение отбрасывается в конце функции.
По-видимому, это не только я, кто не понимает, как это работает; была отправлена .