当我添加生命周期时,有没有办法避免向所有下游结构添加生命周期?

kks*_*eed 5 lifetime rust

我有一个结构:

struct C {
    field: Box<Fn()>
}

struct D(C)
struct E(C)
struct F(D)
Run Code Online (Sandbox Code Playgroud)

C我想更改to的字段&Fn()以适应命名函数。我遇到了麻烦,因为 Rust 结构中的引用字段需要一个生命周期参数。C现在必须是:

struct C<'a> {
    field: &'a Fn()
}
Run Code Online (Sandbox Code Playgroud)

然后对于D, E, F, 我还必须提供生命周期参数:

struct D<'a>(c<'a>)
struct E<'a>(C<'a>)
struct F<'a>(C<'a>)
Run Code Online (Sandbox Code Playgroud)

想象一下D, E,F有很多impl功能...现在代码需要进行大量更改才能在很多地方添加生命周期参数。

有没有办法避免这样做?的生命周期参数C不能是,'static因为我也有一堆本地定义的闭包。

She*_*ter 5

Matthieu M. 回答了“我怎样才能避免增加一生”的问题,这可能解决了你的问题,但没有解决你的问题

当我添加生命周期时,有没有办法避免向所有下游结构添加生命周期

不,没有办法。生命周期注释是您用来参数化类型的另一种泛型类型。使用该类型的所有内容都必须了解其参数化的具体生命周期。生命周期的一个重要原因就是因为这个 - 为了拥有一个安全的系统,编译器(和你!)必须知道结构体包含对可能超出范围的内容的引用。一旦发生这种情况,参考资料就不再有效。


Mat*_* M. 2

有一个非常简单的方法可以避免这种情况:也可以用于Box<Fn()>常规函数。

Rust 有两种类型的抽象函数:

  • fn()代表“简单”功能
  • Fn()对函数和闭包的抽象

所以使用Box<Fn()>可以让你两者兼得。

当然,这里有一个内存分配,这对于“裸”函数来说是不必要的。您可能会发现这种权衡是可以接受的,而不必重构整个代码。

如果您打算避免内存分配,您可能需要研究Cow.