如何实现一个具有生命周期注解的通用向量结构体?

18
以下代码可以正常编译:
pub struct Reader<'a> {
    position: uint,
    data: &'a [u8]
}

这是一个读取器,它以u8类型的向量(实际上是切片)作为引用,并指定了生命周期。

然而,这并不完全符合我的要求。我想使结构体成为通用型,更加准确地说,我想表示该类型应该是任何东西的切片。首先,我尝试了以下内容:

pub struct Reader<'a, T> {
    position: uint,
    data: &'a T
}

它并不表示 T 是一个slice,但是这已经失败并显示以下信息:

参数类型 T 可能无法存活足够长的时间;考虑添加显式生命周期约束 T: 'a...

好了,所以我只需要指定生命周期。但是现在我的问题是如何使它成为Slice类型并具有生命周期?我尝试了一些像Reader<'a, T: 'a Vec>T: 'a [T]之类的东西,但我不知道应该如何表示它,官方指南似乎没有处理这种情况。我只想构建一个Reader,通过借用任何类型的slice,并提供操作数据的方法(以只读方式)。
2个回答

34
试了一下,我终于弄明白了:
pub struct Reader<'a, T> {
    position: uint,
    data: &'a [T]
}

这将读者的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
        }
    }
}

非常有帮助!感谢您发布解决方案! - Gedweb
为什么你需要 'T: 'a?也许在2014年之前是必需的,但现在不再需要了。它可以在没有它的情况下编译通过:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=9d4058d66f152f9f6e94d19d3258058f - Nawaz

12

不打算直接回答,只是在寻找解决自己问题的答案时偶然发现了这个stackoverflow的答案:如何对一个结构体的字段应用通用类型约束和生命周期约束。

(这是我想出来的可行解决方案。)

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接