任何人都知道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)
答案 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:|
生成关闭工具FnMut
,let mut
需要能够调用call_mut
。