从Rust中的任务调用一个闭包

Mir*_* N. 1 rust

任何人都知道在Rust中是否有解决以下错误的方法?

或者至少解释错误的含义?文档说发送特征没有实现者......

fn f1() {
    println!("f1");
}

fn main() {
    let f2 = || {
        println!("f2");
    };
    spawn(proc() {
        f1();
        f2();  // error: the trait `core::kinds::Send` is not implemented for the type `||`
    });
}
Run Code Online (Sandbox Code Playgroud)

这是

$ rustc --version
rustc 0.13.0-nightly (adb44f53d 2014-10-12 00:07:15 +0000)
Run Code Online (Sandbox Code Playgroud)

Fra*_*gné 5

Send是一种类型,它是由编译器在具有特定特征的类型上自动实现的特征.Send例如,描述了"能够跨任务边界传输的类型".类型无法实现的主要原因是类型是否Send包含借用的指针.

闭包类型通过引用捕获它们的环境,即使用等效的借用指针,因此它们不实现Send.proc另一方面,s通过"移动"捕获它们的环境,即在其中引用的值proc被移入proc,这意味着在proc定义之后不能使用该值.因为他们通过移动来捕获他们的环境proc,所以他们拥有他们捕获的所有数据,因此他们实现Send并且您可以将它们发送给另一个proc.但是,procs还有另一个重要的限制:你不能多次调用它们.

未装箱的闭包是一种仍在开发中的新功能,可为这些问题提供解决方案.这是使用未装箱的闭包的示例:

#![feature(unboxed_closures, overloaded_calls)]

fn f1() {
    println!("f1");
}

fn main() {
    let f2 = |&:| {
        println!("f2");
    };
    spawn(proc() {
        f1();
        f2();
        f2(); // f2 can be called again
    });
}
Run Code Online (Sandbox Code Playgroud)

|&:|定义实现的闭包Fn,这意味着call在不可变引用上调用该方法.由于闭包不捕获任何东西,它实现Send,并且因为调用闭包不会消耗它(|:|因为这样的闭包实现FnOnce,在其中call_once调用by-value self),它可以被多次调用.

如果闭包需要改变它的环境,你也可以像这样定义闭包:

fn main() {
    let mut f2 = |&mut:| {
        println!("f2");
    };
    spawn(proc() {
        f1();
        f2();
        f2();
    });
}
Run Code Online (Sandbox Code Playgroud)

|&mut:|制作闭包工具FnMut,并且let mut必须能够调用call_mut.