Как реализовать структуру, которая принимает общий вектор с аннотациями времени жизни?
Следующие компилируются:
pub struct Reader<'a> {
position: uint,
data: &'a [u8]
}
Это читатель, который принимает вектор (фактически срез) типа u8
в качестве ссылки, и я указываю время жизни.
Однако это не совсем то, что я хочу. Я хочу иметь возможность сделать структуру generic, а если быть более точным, я хочу сказать, что тип должен быть срезом чего угодно. Я попробовал это для начала:
pub struct Reader<'a, T> {
position: uint,
data: &'a T
}
Это не означает, что T
является срезом, но это уже не с сообщением:
тип параметра T
может не прожить достаточно долго; рассмотрим добавление явной привязки времени жизни T:'a
...
Хорошо, поэтому мне просто нужно было указать время жизни.
Но теперь моя проблема в том, что как сделать его общим для slice-типа и иметь время жизни? Я пробовал такие вещи, как Reader<'a, T: 'a Vec>
и T: 'a [T]
но я понятия не имею, как я должен это обозначать, и официальное руководство не похоже на такой случай.
Я просто хочу построить Reader, который принимает любой тип среза, заимствуя его, и предоставляет методы для работы с данными (только для чтения).
Ответы
Ответ 1
Попытавшись немного больше, я, наконец, понял:
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
}
}
}
Ответ 2
Не намереваясь напрямую отвечать, просто я столкнулся с этим ответом SO, когда искал ответ на мою собственную проблему: как применить ограничение типа generic и ограничение срока службы для поля структуры.
(Вот работающее решение, с которым я столкнулся).
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
}