Как правильно использовать время жизни в структурах Rust

У меня есть следующая структура в одном из ящиков, которые я использую.

pub struct Set<'a, 'b: 'a, 'c: 'a + 'b> {
    sockets: ManagedSlice<'a, Option<Item<'b, 'c>>>,
}

impl<'a, 'b: 'a, 'c: 'a + 'b> Set<'a, 'b, 'c> {
    pub fn new<SocketsT>(sockets: SocketsT) -> Set<'a, 'b, 'c>
    where
        SocketsT: Into<ManagedSlice<'a, Option<Item<'b, 'c>>>>,
    {
        let sockets = sockets.into();
        Set { sockets: sockets }
    }
}

Мне нужно, чтобы структура Set была одним из полей в другой структуре:

pub struct foo {
    sockets: Set,
}

impl foo {
    pub fn init(&mut self) {
        self.sockets = Set::new(vec![]);
    }
}

Это приводит к следующей ошибке:

   |
21 |     sockets:Set,
   |             ^^^^^^^^^ expected 3 lifetime parameters

Я читал о расширенных жизнях, но не мог понять, как это решить. Как здесь правильно установить время жизни?


person Dragonight    schedule 05.04.2018    source источник
comment
Ортогонально этой проблеме: помните, что имена структур обычно находятся в PascalCase: foo предпочтительно должно быть Foo.   -  person E_net4 the curator    schedule 05.04.2018


Ответы (2)


Вам нужно добавить аннотации времени жизни в структуру:

pub struct Foo<'a, 'b: 'a, 'c: 'a + 'b> {
    sockets: Set<'a, 'b, 'c>,
}

а также реализовать, гарантируя ограничения времени жизни аннотаций:

impl<'a, 'b: 'a, 'c: 'a + 'b> Foo<'a, 'b, 'c> {
    ...
}

Например, возможная реализация:

impl<'a, 'b: 'a, 'c: 'a + 'b> Foo<'a, 'b, 'c> {
    pub fn init(&mut self, v: &'a mut Vec<Option<Item<'b, 'c>>>) {
        self.sockets = Set::new(ManagedSlice::Borrowed(v));
    }
}
person attdona    schedule 05.04.2018

Это зависит от того, как вы собираетесь использовать Foo. Возможно, вам подойдет установка всех жизней на 'static. В противном случае вам нужно будет добавить хотя бы один параметр времени жизни к самому Foo и использовать его. В зависимости от вашего варианта использования этого может быть достаточно:

pub struct Foo<'a> {
    sockets:Set<'a, 'a, 'a>,
}

или вам может понадобиться добавить два или три параметра времени жизни:

pub struct Foo<'a, 'b: 'a, 'c: 'a + 'b> {
    sockets:Set<'a, 'b, 'c>,
}

PS: В качестве примечания, ваша структура foo должна быть написана с заглавной буквы: Foo.

person Jmb    schedule 05.04.2018