Время жизни Rust в Vec <& T>: сложный синтаксис - PullRequest
0 голосов
/ 04 марта 2019

Я изучаю Rust с официальной книгой.Я столкнулся со странным синтаксисом в моей программе:

pub struct Shelf<'a> {
    items: Vec<&'a Item<'a>>, // => working as expected
    //items: Vec<Item<'a>>, // => not working
    //items: Vec<&'a Item>, // => not working
}

Элемент - это структура, которая содержит ссылки и на другие типы:

pub struct Item<'a> {
    owner: &'a Owner,
    name: String,
    avg_rating: u32,
    status: ItemStatus,
}

pub struct Owner {
    pub name: String,
}

Мне кажется, что синтаксис items: Vec<&'a Item<'a>> странно, и я не думаю, что я делаю правильно ... То, что я хочу, это Vec, который содержит ссылки на Item с, и этот Vec действителен, пока ссылки на Item s, которые он содержит, сами по себе действительны.Разве это не должно быть items: Vec<&'a Item> вместо этого?

1 Ответ

0 голосов
/ 04 марта 2019

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

  • Ваш вектор содержит ссылку на элементы.
  • Каждый элемент содержит ссылку на своего владельца.

Вам необходимо указать, как долго живет каждый тип ссылки.Если вы пишете Vec<&'a Item<'b>>, первое время жизни ('a) указывает, как долго живут ссылки на элементы, а второе время жизни ('b) указывает, как долго живут ссылки на владельцев.

Когда вы пишетеVec<Item<'a>>, компилятор не знает, как долго живут элементы.

Когда вы пишете Vec<&a Item>, компилятор не знает, как долго живут владельцы.

Когда вы используетеОдинаковое время жизни в обоих точках (Vec<&'a Item<'a>>), вы говорите компилятору, что оба времени жизни одинаковы, что означает, что элементы должны жить ровно столько же времени, сколько их владельцы.Это может быть чрезмерно ограничительным, в зависимости от вашего варианта использования может быть лучше сообщить компилятору, что элементы не могут жить дольше, чем их владельцы:

pub struct Shelf<'a, 'b: 'a> {
    items: Vec<&'b Item<'a>>,
}
...