fad*_*bee 1 struct lifetime rust rust-obsolete
编者注:问题中提供的代码在 Rust 1.0 中按原样编译。
我试过了:
trait Inner {}
struct Outer<'a> {
inner: &'a Inner,
}
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨:
trait Inner {}
struct Outer<'a> {
inner: &'a Inner,
}
Run Code Online (Sandbox Code Playgroud)
我如何告诉 Rust 我想要一个包含对实现 trait 的东西的引用的结构?
有两种方法。首先,首选的是使用泛型:
struct Outer<'a, T> {
inner: &'a T,
}
impl<'a, T: Inner> Outer<'a, T> {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这种方法是最有效的,因为所有函数调用都是静态调度的。它也是类型最安全的一个,但它的缺点是你必须在你使用的任何地方指定 trait bound,Outer<T>并且你不能Inner在不同时间在同一个结构中保存不同的实现,因为T必须提前知道.
另一种方法是使用 trait 对象:
struct Outer<'a> {
inner: &'a (Inner + 'a),
}
Run Code Online (Sandbox Code Playgroud)
这是您已经尝试过的,您看到的错误是由于未指定生命周期界限引起的:那+ 'a件事。您需要指定生命周期边界,因为特征可以为具有生命周期参数(如Outer)的结构实现,如果您将这样的结构装箱到 trait 对象中,您需要一种在 trait 对象类型中指定其生命周期参数的方法。
trait 对象的优点是更少的注解,并且能够使用任意类型作为inner具有相同Outer值的字段,只要它满足Inner绑定。缺点是您将获得动态调度,这可能会稍微降低效率。如果没有额外的机制,您也将无法取回 trait 对象的原始类型。
| 归档时间: |
|
| 查看次数: |
4015 次 |
| 最近记录: |