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



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

fn main() {
let closure = || 32;
foo(closure);
foo(closure); //perfectly fine
}
fn foo<F>(f: F) -> u32
where
F: Fn() -> u32,
{
f()
}

操场

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

为什么它有效?

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

fn main() {
let v = 32;
foo(v);
foo(v);
}
fn foo(a: u32) -> u32 {
a
}

另请参阅:

  • 所有基元类型都实现Copy特性吗
  • 为什么";移动";在Rust中没有真正移动
  • 你能克隆一个闭包吗
  • 如何克隆闭包,使它们的类型相同

最新更新