gpt4 book ai didi

closures - 如何在Rust的结构中存储闭包?

转载 作者:行者123 更新时间:2023-12-03 11:38:47 31 4
gpt4 key购买 nike

在Rust 1.0之前,我可以使用以下过时的关闭语法编写结构:

struct Foo {
pub foo: |usize| -> usize,
}

现在我可以做类似的事情:
struct Foo<F: FnMut(usize) -> usize> {
pub foo: F,
}

但是,我创建的 Foo对象的类型是什么?
let foo: Foo<???> = Foo { foo: |x| x + 1 };

我也可以使用引用:
struct Foo<'a> {
pub foo: &'a mut FnMut(usize) -> usize,
}

我认为这比较慢,因为
  • 指针取消引用
  • 对于实际上最终被使用的FnMut类型没有专门的说明
  • 最佳答案

    对于您在第三个代码段中使用的类型,没有一个。闭包类型是匿名的,不能直接命名。相反,您将编写:

    let foo = Foo { foo: |x| x + 1 };

    如果要在需要指定需要 Foo的上下文中编写代码,则应编写:
    let foo: Foo<_> = Foo { foo: |x| x + 1 };
    _告诉类型系统为您推断实际的泛型类型。

    使用的一般经验法则,按降序排列:
  • 通用参数:struct Foo<F: FnMut(usize) -> usize>。这是最有效的方法,但这确实意味着特定的Foo实例只能存储一个闭包,因为每个闭包具有不同的具体类型。
  • 特性引用:&'a mut dyn FnMut(usize) -> usize。有一个指针间接,但是现在您可以存储对具有兼容调用签名的任何闭包的引用。
  • 盒装闭包:Box<dyn FnMut(usize) -> usize>。这涉及在堆上分配闭包,但是您不必担心生存期。与引用一样,您可以存储具有兼容签名的任何闭包。

  • 在Rust 1.0之前

    使用 ||语法的闭包是对存储在堆栈中的闭包的引用,使其等效于 &'a mut FnMut(usize) -> usize。旧式的 proc是堆分配的,等效于 Box<dyn FnOnce(usize) -> usize>(您只能调用 proc一次)。

    关于closures - 如何在Rust的结构中存储闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64433031/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com