编者注:问题中提出的代码按-在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,发布于 2014-10-14 15:48:42
我如何告诉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)实现特征,如果将这样的结构框到属性对象中,则需要一种方法以特征对象类型指定其生存期参数。
特征对象的优点是注释的数量较少,并且能够使用任意类型作为具有相同Outer值的Outer字段,只要它满足Inner绑定。缺点是,您将得到动态调度,这可能会稍微降低效率。如果没有额外的机器,您也不可能获得特性对象的原始类型。
发布于 2018-03-13 02:19:49
这是使用生存期说明符的结构的一个示例。
我必须创建一个带有引用类型SWide的字段的结构。此字段需要是结构内部的引用,因此我在结构中添加了一个生存期说明符,并在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,
}
}
}https://stackoverflow.com/questions/26364310
复制相似问题