2017-01-09 9 views
6

Mam pewne problemy z dynamicznymi typami wskaźników wysyłki w Rust. Chcę przekonwertować wartość typu Box<MyTrait> na &mut MyTrait, aby przejść do funkcji. Na przykład, próbowałem:Konwertuj zapakowaną cechę na referencję cech zmiennych w Rust

use std::borrow::BorrowMut; 

trait MyTrait { 
    fn say_hi(&mut self); 
} 

struct MyStruct { } 

impl MyTrait for MyStruct { 
    fn say_hi(&mut self) { 
     println!("hi"); 
    } 
} 

fn invoke_from_ref(value: &mut MyTrait) { 
    value.say_hi(); 
} 

fn main() { 
    let mut boxed_trait: Box<MyTrait> = Box::new(MyStruct {}); 
    invoke_from_ref(boxed_trait.borrow_mut()); 
} 

ten nie powiedzie się z powodu następującego błędu:

error: `boxed_trait` does not live long enough 
    --> <anon>:22:5 
    | 
21 |   invoke_from_ref(boxed_trait.borrow_mut()); 
    |       ----------- borrow occurs here 
22 |  } 
    | ^`boxed_trait` dropped here while still borrowed 
    | 
    = note: values in a scope are dropped in the opposite order they are created 

dziwo, to działa na &MyTrait ale nie dla &mut MyTrait. Czy jest jakiś sposób, aby przekonwertować tę konwersję do pracy w zmiennym przypadku?

Odpowiedz

7

Wydaje mi się, że ograniczasz bieżące działanie kompilatora. borrow_mut, będąc funkcją, nakłada surowsze wymagania dotyczące czasu życia niż to konieczne.

Zamiast tego, można wziąć zmienny pożyczyć wnętrza pudełka przez pierwszy dereferencing okno, jak poniżej:

fn main() { 
    let mut boxed_trait: Box<MyTrait> = Box::new(MyStruct {}); 
    invoke_from_ref(&mut *boxed_trait); 
}