Expand description
按值捕获 闭包 的环境。
move
将引用或可变引用捕获的任何变量转换为按值捕获的变量。
let data = vec![1, 2, 3];
let closure = move || println!("captured {data:?} by value");
// 数据不再可用,它由闭包拥有
RunNote: 即使 move
闭包通过 move
捕获变量,它们仍然可以实现 Fn
或 FnMut
。
这是因为由闭包类型实现的 traits 是由闭包对捕获的值进行的操作 (而不是对捕获值的方式) 确定的:
fn create_fn() -> impl Fn() {
let text = "Fn".to_owned();
move || println!("This is a: {text}")
}
let fn_plain = create_fn();
fn_plain();
Run当涉及 线程 时,通常使用 move
。
let data = vec![1, 2, 3];
std::thread::spawn(move || {
println!("captured {data:?} by value")
}).join().unwrap();
// 数据被移动到衍生线程,所以我们不能在这里使用它
Runmove
在异步块之前也是有效的。
let capture = "hello".to_owned();
let block = async move {
println!("rust says {capture} from async block");
};
Run