2017-07-15 33 views
5

我有以下代碼:的特質不能做成一個對象

pub trait MyTrait { 
    fn receive(context: Context) -> Future<Item =(), Error = io::Error>; 
} 

pub struct MyStruct { 
    myTrait: MyTrait 
} 

當我嘗試編譯它,我得到的錯誤信息:

the trait MyTrait cannot be made into an object.

我想我知道爲什麼會發生但是,如何從結構中引用特徵?可能嗎?或者也許還有其他一些方法來實現相同的行爲?

回答

6

您可以一個類型參數添加到您的結構,如澤尼克的答案,或使用特質的對象。

使用類型參數對性能更好,因爲每個值T都會創建結構的專用副本,從而允許靜態分派。但是一個trait對象使用動態分派,所以它可以讓你在運行時交換具體類型。

的特質對象的方法是這樣的:

pub struct MyStruct<'a> { 
    myTrait: &'a MyTrait 
} 

或者這樣:

pub struct MyStruct { 
    myTrait: Box<MyTrait> 
} 

然而,在你的情況,MyStruct不能做成一個對象,因爲receive是一個靜態方法。您需要將其更改爲self&self&mut self作爲其工作的第一個參數。還有other restrictions

+0

第一個變體不符合消息:錯誤:預期的標識符,發現「<」 – Alexander

+0

和第二個:特徵「MyTrait」不能被製作成對象 – Alexander

+0

@Alexander查看我的編輯。 –