rust 我如何实现一个接受带有生存期注解的泛型向量的结构?

c0vxltue  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(68)

以下代码编译得很好:

pub struct Reader<'a> {
    position: uint,
    data: &'a [u8]
}

它是一个读取器,接受u8类型的向量(实际上是一个切片)作为引用,我指定了生存期。
但这并不是我想要的。我希望能够使结构体成为泛型,更准确地说,我想表示类型应该是任何东西的一个切片。我尝试了这个初学者:

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

它没有将T表示为切片,但这已经失败并显示一条消息:
参数类型T可能存在的时间不够长;考虑添加一个明确的生命周期界限T:'a.
好吧,我只需要指定生命周期。
但现在我的问题是,我如何使它成为切片类型的泛型,并具有生存期?我尝试了像Reader<'a, T: 'a Vec>T: 'a [T]这样的东西,但我不知道我应该如何表示这一点,官方指南似乎没有处理这样的情况。
我只是想构造一个Reader,它通过借用任何类型的切片来接受它,并提供对数据进行操作的方法(以只读方式)。

zsbz8rwp

zsbz8rwp1#

在尝试了一段时间后,我终于明白了:

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
        }
    }
}
ep6jt1vc

ep6jt1vc2#

不打算直接回答,只是我在寻找自己问题的答案时遇到了这个SO答案:如何将泛型类型约束和生存期约束应用于结构的字段。
(Here这是我想出的工作解决方案。)

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
}

相关问题