为什么生锈要求Sendable traits明确标记为Send?

时间:2014-10-04 09:51:59

标签: rust

我希望这可行:

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"); }
    }
  });
}

围栏:http://is.gd/ORxeRL

......但事实并非如此。

相反,编译器笨拙地要求在特征引用上显式设置发送特征:

struct Bar { v: Option<Box<Foo + Send> + Send> } <--- + Send + Send much?

fn main() {
  let bar = Bar { v: Some(box IsFoo as Box<Foo + Send>) }; <--- 
Foo是Foo:发送;所以...我显然希望它可以发送。为什么需要显式+发送?

即。它是编译器错误吗?

或者是否有理由要求这种冗长?

1 个答案:

答案 0 :(得分:2)

是的,这是一个错误,例如#15155

(为了将来参考,这是rust-lang/rust回购中searching for trait object send时的第一个结果;通常会遇到以前遇到混乱/错误行为的情况,所以你可以通过快速搜索节省一些时间和困惑。)