Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Rust中的任务调用闭包_Rust - Fatal编程技术网

从Rust中的任务调用闭包

从Rust中的任务调用闭包,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 t

有人知道有没有办法解决生锈的问题

或者至少解释一下错误的含义?文档说这个特性没有实现者

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)
是一种类型,这是编译器在具有特定特征的类型上自动实现的特性<例如,代码>发送,描述了“能够跨任务边界传输的类型”。类型不实现
Send
的主要原因是该类型包含借用的指针

闭包类型通过引用来捕获其环境,即使用借用的指针的等价物,因此它们不实现
Send
<另一方面,code>procs通过“移动”捕获其环境,即
proc
中引用的值被移动到
proc
中,这意味着在定义
proc
后不能使用该值。由于它们通过移动捕获环境,
proc
s拥有它们捕获的所有数据,因此它们实现了
Send
,您可以将它们发送到另一个
proc
。然而,
proc
s还有另一个重要的限制:不能多次调用它们

未绑定闭包是一个仍在开发中的新功能,它为这些问题提供了解决方案。下面是一个使用未装箱闭包的示例:

#![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
    });
}
和:
定义了一个实现的闭包,这意味着对不可变引用调用
调用
方法。由于闭包不捕获任何内容,因此它实现了
Send
,并且调用闭包不会消耗它(而
|:|
会消耗它,因为这样的闭包实现了,在这种闭包中,
call\u一次
在by值
self
上被调用),因此可以多次调用它

如果闭包需要改变其环境,也可以这样定义闭包:

fn main() {
    let mut f2 = |&mut:| {
        println!("f2");
    };
    spawn(proc() {
        f1();
        f2();
        f2();
    });
}
|&mut:|
实现闭包,并且需要
让mut
能够调用
调用

是一种类型,这是编译器在具有特定特征的类型上自动实现的特性<例如,代码>发送
,描述了“能够跨任务边界传输的类型”。类型不实现
Send
的主要原因是该类型包含借用的指针

闭包类型通过引用来捕获其环境,即使用借用的指针的等价物,因此它们不实现
Send
<另一方面,code>procs通过“移动”捕获其环境,即
proc
中引用的值被移动到
proc
中,这意味着在定义
proc
后不能使用该值。由于它们通过移动捕获环境,
proc
s拥有它们捕获的所有数据,因此它们实现了
Send
,您可以将它们发送到另一个
proc
。然而,
proc
s还有另一个重要的限制:不能多次调用它们

未绑定闭包是一个仍在开发中的新功能,它为这些问题提供了解决方案。下面是一个使用未装箱闭包的示例:

#![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
    });
}
和:
定义了一个实现的闭包,这意味着对不可变引用调用
调用
方法。由于闭包不捕获任何内容,因此它实现了
Send
,并且调用闭包不会消耗它(而
|:|
会消耗它,因为这样的闭包实现了,在这种闭包中,
call\u一次
在by值
self
上被调用),因此可以多次调用它

如果闭包需要改变其环境,也可以这样定义闭包:

fn main() {
    let mut f2 = |&mut:| {
        println!("f2");
    };
    spawn(proc() {
        f1();
        f2();
        f2();
    });
}
|&mut:|
实现闭包,并且需要
让mut
能够调用
调用_mut