我希望这可行:
trait Foo: Send { fn ok(&self) -> int; }
struct IsFoo;
impl Foo for IsFoo { fn ok(&self) -> int { return 1; } }
struct Bar { v: Option<Box<Foo>> }
fn main() {
let bar = Bar { v: Some(box IsFoo as Box<Foo>) };
spawn(proc() {
match bar.v {
Some(ref foo) => {
assert!(foo.ok() == 1);
}
_ => { fail!("Unreachable"); }
}
});
}
......但事实并非如此。
相反,编译器笨拙地要求在特征引用上显式设置发送特征:
struct Bar { v: Option<Box<Foo + Send> + Send> } <--- + Send + Send much?
fn main() {
let bar = Bar { v: Some(box IsFoo as Box<Foo + Send>) }; <---
即。它是编译器错误吗?
或者是否有理由要求这种冗长?
答案 0 :(得分:2)
是的,这是一个错误,例如#15155。
(为了将来参考,这是rust-lang/rust
回购中searching for trait object send
时的第一个结果;通常会遇到以前遇到混乱/错误行为的情况,所以你可以通过快速搜索节省一些时间和困惑。)