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

Som*_*ame 3 closures ownership rust borrow-checker

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

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

fn foo<F>(f: F) -> u32
where
    F: Fn() -> u32,
{
    f()
}
Run Code Online (Sandbox Code Playgroud)

操场

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

为什么有效?

She*_*ter 6

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

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

fn foo(a: u32) -> u32 {
    a
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:


归档时间:

查看次数:

56 次

最近记录:

5 年,5 月 前