【问题标题】:Rust lifetime in Vec<&T> : convoluted syntaxVec<&T> 中的 Rust 生命周期:复杂的语法
【发布时间】:2019-03-04 14:10:15
【问题描述】:

我正在通过官方书籍学习 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&lt;&amp;'a Item&lt;'a&gt;&gt; 的语法很奇怪,我认为我做的不对...我想要的是一个包含对 Items 的引用的 Vec,以及 @987654328只要它包含的对Items 的引用本身是有效的,@ 就有效。不应该是items: Vec&lt;&amp;'a Item&gt;吗?

【问题讨论】:

标签: rust lifetime


【解决方案1】:

您需要指定两个生命周期:

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

您需要指定每种类型的参考存在多长时间。如果您编写 Vec&lt;&amp;'a Item&lt;'b&gt;&gt;,第一个生命周期 ('a) 指定对项目的引用的存活时间,第二个生命周期 ('b) 指定对所有者的引用的存活时间。

当您编写Vec&lt;Item&lt;'a&gt;&gt; 时,编译器不知道项目的寿命。

当你写Vec&lt;&amp;'a Item&gt;时,编译器不知道所有者的寿命。

当您为两个点使用相同的生命周期 (Vec&lt;&amp;'a Item&lt;'a&gt;&gt;) 时,您是在告诉编译器两个生命周期是相同的,这意味着项目的生命周期必须与其所有者的生命周期完全相同。这可能过于严格,根据您的用例,最好告诉编译器项目的寿命可能不会比它们的所有者长:

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

【讨论】:

  • 谢谢,这很有帮助!它还强调了“容器”结构中的馆藏引用是一个坏主意,我应该组织我的代码直接拥有我的结构中的东西,而不是引用。因此,在我的示例中,我应该反转“Item”包含对“Owner”的引用的逻辑,而不是像这样使我的结构“Owner”:pub struct Owner { pub name: String, pub items: Vec&lt;Item&gt;, } 并避免所有生命周期的复杂性。
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2017-05-03
相关资源
最近更新 更多