编者注:问题中提供的代码在Rust 1.0中按原样编译。
我试过了:
trait Inner {}
struct Outer<'a> {
inner: &'a Inner,
}
但是编译器抱怨:
Compiling tst v0.1.0 (file:///home/chris/rust/tst)
/home/chris/rust/tst/src/main.rs:4:14: 4:19 error: explicit lifetime bound required
/home/chris/rust/tst/src/main.rs:4 inner: &'a Inner,
答案 0 :(得分:4)
如何告诉Rust我想要一个包含引用的结构 实现特质的东西?
有两种方法。首先,首选的是使用泛型:
struct Outer<'a, T> {
inner: &'a T,
}
impl<'a, T: Inner> Outer<'a, T> {
// ...
}
此方法效率最高,因为所有函数调用都是静态调度的。它也是最安全的类型,但它的缺点是你必须在使用Outer<T>
的任何地方指定特征限制,你将无法在同一个地方指定Inner
的不同实现不同时间的结构,因为T
必须提前知道。
另一种方法是使用特质对象:
struct Outer<'a> {
inner: &'a (Inner + 'a),
}
这是你已经尝试过的,你看到的错误是由于没有指定生命周期限制引起的:+ 'a
事。您需要指定一个生命周期绑定,因为可以为具有生命周期参数的结构(如Outer
)实现traits,如果将这样的结构封装到trait对象中,则需要一种方法在trait对象中指定其生命周期参数类型。
特征对象的优点是注释量较少,并且能够将任意类型用作相同inner
值的Outer
字段,只要它满足Inner
绑定即可。缺点是您将获得动态调度,这可能会稍微降低效率。如果没有额外的机器,你也无法找回特征对象的原始类型。
答案 1 :(得分:-1)
这是使用生命周期说明符的结构示例。
我必须创建一个带有字段的结构,该字段是对SWide
类型的引用。这个字段需要是struct中的引用,所以我在struct中添加了一个生命周期说明符,并为impl添加了一个生命周期说明符,注意你必须在impl行中两次使用相同的生命周期说明符:
extern crate mysql;
use mysql::Pool;
use swide::SWide;
pub struct Context<'a> {
pub connection_pool: Pool,
pub cache: Option<&'a SWide>,
}
impl<'a> Context<'a> {
pub fn new_with_cache(connection_pool: Pool, cache: Option<&'a SWide>) -> Self {
Context {
connection_pool: connection_pool,
cache: cache,
}
}
}