如何实现一个带有生命周期注释的泛型向量的结构?

Kai*_*ren 13 rust

以下编译正常:

pub struct Reader<'a> {
    position: uint,
    data: &'a [u8]
}
Run Code Online (Sandbox Code Playgroud)

它是一个读者,它将一个类型的矢量(实际上是一个片段)u8作为参考,并指定生命周期.

然而,这并不是我想要的.我希望能够使结构通用,更准确地说,我想表示类型应该是任何东西的切片.我为初学者尝试了这个:

pub struct Reader<'a, T> {
    position: uint,
    data: &'a T
}
Run Code Online (Sandbox Code Playgroud)

它并不表示T是一个切片,但这已经失败了一条消息:

参数类型T可能不够长; 考虑添加显式生命周期绑定T:'a...

好的,我只需要指定生命周期.

但现在我的问题是如何使它成为切片类型的通用并具有生命周期?我尝试了类似的东西Reader<'a, T: 'a Vec>,T: 'a [T]但我不知道我应该如何表示这一点,官方指南似乎没有处理这样的情况.

我只是想通过借用它来构造一个接受任何类型切片的Reader,并提供对数据进行操作的方法(以只读方式).

Kai*_*ren 25

经过多尝试后,我终于明白了:

pub struct Reader<'a, T: 'a> {
    position: uint,
    data: &'a [T]
}
Run Code Online (Sandbox Code Playgroud)

这将读者定义data为类型Slice<T>([]表示切片)并&'a指定借用数据的生命周期.

现在我可以实现这样的东西:

impl<'a, T> Reader<'a, T> {
    pub fn from_data(bytes: &'a[T]) -> Reader<'a, T> {
        Reader {
            position: 0,
            data: bytes
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*ies 7

不打算直接回答,只是说我碰到这个来得如此回答时,我一直在寻找的答案,我自己的问题:如何将一个泛型类型约束和寿命限制适用于结构的领域.

(这是我提出的工作解决方案.)

use std::io::Writer;

// This specifies lifetime constraint of 'a
// Type W must implement the Writer trait
// Type W has the lifetime 'a (the same as the related struct instance)
pub struct Foo<'a, W: 'a + Writer> {
    writer: &'a mut W
}
Run Code Online (Sandbox Code Playgroud)