我试图理解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中没有真正移动
- 你能克隆一个闭包吗
- 如何克隆闭包,使它们的类型相同