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

标签 rust closures borrow-checker 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
}

另见:

关于rust - 为什么转移所有权后可以使用非捕获闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63120155/

相关文章:

serialization - 通过实现 serde `Deserializer` 将值的 Vec 反序列化为结构体

rust - Rust SDL : how do I “attach” a surface to a window?

rust - Rust 中的可变Arc

JavaScript img onLoad 和闭包 - 为什么这段代码会触发无限循环?

rust - 为什么不能在同一结构中存储值和对该值的引用?

callback - 在 Rust 中实现多个可变(静态分配、静态分派(dispatch)等)回调的正确方法是什么?

rust - 如何从 HashMap 或 HashSet 返回 get_mut 的结果?

oop - 为什么 Rust 不支持特征对象向上转换?

Swift 闭包捕获不是通过 for 循环中的引用?

javascript - 调用带有多个闭包的 javascript 函数