Keyword move[][src]

Expand description

按值捕获 闭包 的环境。

move 将任何通过引用捕获的变量转换为通过引用捕获的变量。

let data = vec![1, 2, 3];
let closure = move || println!("captured {:?} by value", data);

// 数据不再可用,它由闭包拥有
Run

Note: 即使 move 闭包通过 move 捕获变量,它们仍然可以实现 FnFnMut。 这是因为由闭包类型实现的 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 {:?} by value", data)
}).join().unwrap();

// 数据被移动到衍生线程,所以我们不能在这里使用它
Run

move 在异步块之前也有效。

let capture = "hello".to_owned();
let block = async move {
    println!("rust says {} from async block", capture);
};
Run

有关 move 关键字的更多信息,请参见 Rust 书籍的 闭包 部分或 线程 部分。