У меня есть this minimal example code:Как работает заимствование 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) { }
но он терпит неудачу с этой ошибкой:
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 обнаружили, что у меня есть разыменовать поле, чтобы получить содержимое, а затем заимствовать содержание. 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) { }
Это работает, но я не понимаю.
Зачем мне сначала разыгрывать? Какая ошибка пытается сказать? Обычно это не ошибка, когда значение падает в конце функции.
По-видимому, не только я не понимаю, как это работает; a issue has been filed.
Обратите внимание, что вам даже не нужно вызывать 'encrypt' для получения этой ошибки; просто попытка создать отдельную изменчивую ссылку через 'loan_mut' потерпит неудачу. – ljedrz
[кодовая версия комментария ljedrz] (http://play.integer32.com/?gist=c36fba752d8b9500d3b1356c4f33dcd1&version=stable). – Shepmaster
Существует некоторая дискуссия на https://users.rust-lang.org/t/trait-objects-and-borrowmut/8520 –