mam this minimal example code:Jak działa wypożyczanie treści Box <Trait>?
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) { }
ale nie jest on z tego błędu:
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
Rodzaju ludzie w #rustbeginners okazało się, że muszę dereference polu, aby uzyskać zawartość, a następnie pożyczyć zawartość. Like this:
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) { }
To działa, ale ja tego nie rozumiem.
Dlaczego muszę najpierw usunąć dereferencję? Co mówi błąd? Zwykle nie jest błędem, że wartość jest zrzucana na końcu funkcji.
Najwyraźniej to nie tylko ja nie rozumiem, jak to działa; issue has been filed.
Pamiętaj, że nie musisz nawet wywoływać "szyfrowania", aby uzyskać ten błąd; próba utworzenia samodzielnego odwołania do zmiennej za pomocą 'borrow_mut' może się nie powieść. – ljedrz
A [wersja kodu komentarza ljedrza] (http://play.integer32.com/?gist=c36fba752d8b9500d3b1356c4f33dcd1&version=stable). – Shepmaster
Jest dyskusja na https://users.rust-lang.org/t/trait-objects-and-borrowmut/8520 –