在Rust中,有没有办法将结构/类型更改为“发送”?

时间:2014-02-07 03:02:25

标签: rust

我尝试将这些问题传递给spawn函数(创建新的线程/任务)并让编译器告诉我error: cannot capture variable of type "blah blah", which does not fulfill "Send", in a bounded closure

有没有办法转换类型能够实现“发送”还是基于某些规则修复?

例如,我可以通过使用如下指令轻松实现ToStr特征:

#[deriving(ToStr, Rand)]
struct Point {
    x: int,
    y: int,
}

我可以为Send特质做类似的事情吗?或者“善良”的特质处理方式不同?

以下是此问题的一个具体示例 - 是否有某种方法可以克服它?

fn create_process_options(cmdinfo: &CmdInfo) -> (ProcessOptions, Option<FileDesc>) {
// ... omitted
}

// "po" is of type std::run::ProcessOptions
let (po, filedesc_opt) = create_process_options(&cmdinfo);
spawn(proc() {
    let mut ps = Process::new(cmdinfo.program, cmdinfo.args, po).expect("darn");
    ps.finish();
});

编译错误:

error: cannot capture variable of type `std::run::ProcessOptions<>`, which does not fulfill `Send`, in a bounded closure
let mut process = Process::new(cmdinfo.program, cmdinfo.args, po).expect("darn");
                                                              ^~
note: this closure's environment must satisfy `Send`
let mut process = Process::new(cmdinfo.program, cmdinfo.args, po).expect("darn");

1 个答案:

答案 0 :(得分:4)

发送是一个生锈种类,您提到的其他内容是 Traits 。虽然两者都可以用来约束泛型,但它们实际上是完全不同的。您必须选择加入Trait,但根据其内容推断出类型的类型 - 除了更改内容之外,您无法更改类型的种类。

对于大多数种类,规则是“如果X的所有成员都是Y型,则X类型为Y类。”

在这种情况下,由于发送要求您满足'static,这意味着它们不包含任何非'static引用。由于ProcessOptions包含非静态生命周期Option<&'a Path>,因此Chris Morgan在评论中详细说明,ProcessOptions不符合发送。