我有一个结构:
struct C {
field: Box<Fn()>
}
struct D(C)
struct E(C)
struct F(D)
我想将C
的字段更改为&Fn()
,以适应命名函数。我遇到了麻烦,因为Rust结构中的引用字段需要一个生命周期参数。 C
现在必须是:
struct C<'a> {
field: &'a Fn()
}
然后,对于D
,E
,F
,我还必须提供生命周期参数:
struct D<'a>(c<'a>)
struct E<'a>(C<'a>)
struct F<'a>(C<'a>)
想象一下D
,E
,F
有许多impl
个函数......现在代码需要进行大量更改才能将生命周期参数添加到很多地方。
有没有办法避免这样做? C
的生命周期参数不能是'static
,因为我还有一堆本地定义的闭包。
答案 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
。