从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