Как реализовать структуру, которая принимает общий вектор с аннотациями времени жизни?

Следующие компилируются:

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
}