Vec <&T>中的Rust生存时间:复杂的语法

时间:2019-03-04 14:10:16

标签: rust lifetime

我正在用官方书学习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
}

Item是一个也包含对其他类型的引用的结构:

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的引用本身是有效的即可。应该不是items: Vec<&'a Item>吗?

1 个答案:

答案 0 :(得分:3)

您需要指定两个生存期:

  • 您的向量包含对项目的引用。
  • 每个项目都包含对其所有者的引用。

您需要指定每种参考类型的寿命。如果您写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>>,
}