2014-09-03 69 views
9

因此,我希望能夠在任務之間發送特質對象,但無法弄清楚是否可能。它似乎不可能,因爲它們顯然不符合Send類型。在Rust中的任務之間發送特質對象

下面的代碼演示基本上就是我想要做的事:

trait Bar { 
    fn bar(&self); 
} 

struct Foo { foo: uint } 

impl Bar for Foo { 
    fn bar(&self) { 
     println!("foo: {}", self.foo); 
    } 
} 

fn main() { 
    let foo = box Foo { foo: 1 } as Box<Bar>; 

    let (tx, rx): (Sender<Box<Bar>>, Receiver<Box<Bar>>) = channel(); 

    spawn(proc() { 
     tx.send(foo); 
    }); 

    let sent = rx.recv(); 

    sent.bar(); 
} 

使用防鏽Nightlies版,這個失敗,出現以下消息:

traittest.rs:16:60: 16:67 error: instantiating a type parameter with an incompatible type Box<Bar+'static> , which does not fulfill Send [E0144]

traittest.rs:16 let (tx, rx): (Sender>, Receiver>) = channel();

我剪斷的休息所有這些行都抱怨沒有履行Send

此外,試圖發送一個普通的,unboxed特質對象導致了一堆其他錯誤,主要是抱怨不履行Send + Sized

對於Rust而言,我還是比較新的,所以我不確定是否有一些我錯過了。但我覺得沒有辦法說服編譯器製作特徵對象Send

如果目前尚不可能,那麼目前是否有任何可能允許未來進行的工作?

回答

9

這是可能的。你可以添加一個發送約束到像這樣的特質對象:

let foo = box Foo { foo: 1 } as Box<Bar + Send>; 

let (tx, rx): (Sender<Box<Bar + Send>>, Receiver<Box<Bar + Send>>) = channel(); 
+2

哦,這很簡單。我想我不太瞭解特質對象是如何處理的。所以這不是那種特質,它是潛在的對象,對吧?所以你只需要讓編譯器知道這個盒子裏有一些特質,這也正好符合'Send'的要求。我想我現在明白了。 – guff 2014-09-03 16:48:44