2014-09-03 70 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