有没有办法避免在添加生命周期时为所有下游结构添加生命周期?

时间:2017-01-30 08:20:31

标签: rust lifetime

我有一个结构:

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

struct D(C)
struct E(C)
struct F(D)

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

struct C<'a> {
    field: &'a Fn()
}

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

struct D<'a>(c<'a>)
struct E<'a>(C<'a>)
struct F<'a>(C<'a>)

想象一下DEF有许多impl个函数......现在代码需要进行大量更改才能将生命周期参数添加到很多地方。

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

2 个答案:

答案 0 :(得分:4)

Matthieu M. has answered问题&#34;我怎样才能避免添加生命周期&#34;,这可能会解决您的问题而不是问题

  

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

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

答案 1 :(得分:2)

有一种非常简单的方法可以避免这种情况:只需将<form [formGroup]="userForm" (ngSubmit)="onSubmit()" class="form-group"> <label>Gender</label> <label><input type="radio" name="gender" /> Male</label> <label><input type="radio" name="gender" />Female</label> <button type="submit" [disabled]="!userForm.valid" class="btn btn-success">Submit</button> </form> 用于常规函数。

Rust有两种抽象函数:

  • Box<Fn()>代表&#34;简单&#34;功能
  • fn()摘要函数和闭包

因此,使用Fn()可以同时拥有两者。

当然,这里有一个内存分配,对于&#34;裸体&#34;功能。您可能会发现可以接受折衷而不必重构整个代码。

如果您打算避免内存分配,可能需要查看Cow