我正在通过官方书籍学习 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
}
Run Code Online (Sandbox Code Playgroud)
Item 是一个结构体,也包含对其他类型的引用:
pub struct Item<'a> {
owner: &'a Owner,
name: String,
avg_rating: u32,
status: ItemStatus,
}
pub struct Owner {
pub name: String,
}
Run Code Online (Sandbox Code Playgroud)
在我看来,语法items: Vec<&'a Item<'a>>很奇怪,我认为我做得不对...我想要的是Vec包含对Items 的引用的 a ,Vec只要Item它包含的对 s 的引用本身有效,它就是有效的。不应该是items: Vec<&'a Item>这样吗?
您需要指定两个生命周期:
您需要指定每种类型的参考的寿命。如果您编写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>>,
}
Run Code Online (Sandbox Code Playgroud)