以下编译正常:
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,并提供对数据进行操作的方法(以只读方式)。
答案 0 :(得分:24)
经过多尝试后,我终于明白了:
pub struct Reader<'a, T: 'a> {
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
}
}
}
答案 1 :(得分: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
}