我如何声明我想要一个包含对实现特征的东西的引用的结构?

时间:2014-10-14 15:14:08

标签: struct rust lifetime rust-obsolete

  

编者注:问题中提供的代码在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,

2 个答案:

答案 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,
        }
    }
}