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

时间:2014-10-14 20:56:58

标签: rust

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

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

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

这是

$ rustc --version
rustc 0.13.0-nightly (adb44f53d 2014-10-12 00:07:15 +0000)

1 个答案:

答案 0 :(得分:5)

Send kind ,这是一种特性,由编译器在具有特定特征的类型上自动实现。例如,Send描述了能够跨任务边界转移的#34;类型。类型不能实现Send的主要原因是类型是否包含借用的指针。

关闭类型通过引用捕获它们的环境,即使用等效的借用指针,因此它们不会实现Send。另一方面,proc通过"移动"捕获他们的环境,即proc内引用的值被移动到proc,这意味着你可以&# 39; t在定义proc后使用该值。因为他们通过移动来捕获他们的环境,proc拥有他们捕获的所有数据,所以他们实施Send并且您可以将它们发送到另一个proc。但是,proc还有另一个重要限制:您无法多次调用它们。

Unboxed闭包是一项仍处于开发阶段的新功能,可为这些问题提供解决方案。以下是使用未装箱的闭包的示例:

#![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
    });
}

|&:|定义了一个实现Fn的闭包,这意味着在不可变引用上调用call方法。由于闭包没有捕获任何东西,它实现了Send,并且因为调用闭包不会消耗它(|:|会这样做,因为这样的闭包实现了FnOnce,在值call_once上调用self的情况下,可以多次调用它。

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

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

|&mut:|生成关闭工具FnMutlet mut需要能够调用call_mut