Keyword move

source ·
Expand description

按值捕获 闭包 的环境。

move 将引用或可变引用捕获的任何变量转换为按值捕获的变量。

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

// 数据不再可用,它由闭包拥有
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 {data:?} by value")
}).join().unwrap();

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

move 在异步块之前也是有效的。

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

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