为什么转移所有权后可以使用非捕获闭包?

Why can a non-capturing closure be used after transferring ownership?

我试图了解 Rust 中的所有权,但遇到了与转让所有权相关的误解。考虑以下代码:

fn main() {
    let closure = || 32;
    foo(closure);
    foo(closure); //perfectly fine
}

fn foo<F>(f: F) -> u32
where
    F: Fn() -> u32,
{
    f()
}

playground

我认为应该转让所有权,不应允许第二次调用foo(closure)

为什么有效?

您的闭包实现了 Copy,因此当您第二次使用它时,会自动生成一个副本。您的代码的工作原理与此相同:

fn main() {
    let v = 32;
    foo(v);
    foo(v);
}

fn foo(a: u32) -> u32 {
    a
}

另请参阅:

  • Why does "move" in Rust not actually move?
  • Can you clone a closure?