因此,我希望能够在任务之间发送特质对象,但无法弄清楚是否可能。它似乎不可能,因为它们显然不符合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 fulfillSend
[E0144]traittest.rs:16 let (tx, rx): (Sender>, Receiver>) = channel();
我剪断的休息所有这些行都抱怨没有履行Send
。
此外,试图发送一个普通的,unboxed特质对象导致了一堆其他错误,主要是抱怨不履行Send + Sized
。
对于Rust而言,我还是比较新的,所以我不确定是否有一些我错过了。但我觉得没有办法说服编译器制作特征对象Send
。
如果目前尚不可能,那么目前是否有任何可能允许未来进行的工作?
哦,这很简单。我想我不太了解特质对象是如何处理的。所以这不是那种特质,它是潜在的对象,对吧?所以你只需要让编译器知道这个盒子里有一些特质,这也正好符合'Send'的要求。我想我现在明白了。 – guff 2014-09-03 16:48:44