2017-01-09 39 views
6

可變特性引用我遇到一些麻煩魯斯特動態分配指針類型。我想將Box<MyTrait>類型的值轉換爲&mut MyTrait以傳遞給函數。例如,我想:轉換盒裝性狀魯斯特

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()); 
} 

這失敗,出現以下錯誤:

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 

奇怪的是,這個工程的&MyTrait而不是&mut MyTrait。有什麼辦法可以讓這個轉換工作在可變的情況下?

回答

7

我認爲你正在運行到當前編譯器的生命週期處理的限制。作爲一項功能,borrow_mut規定了超出必要的更嚴格的使用期限要求。

取而代之的是,你可以通過先提領的箱子,像這樣採取一個可變借到盒子的內部:

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