Vec<&T> 中的 Rust 生命周期:复杂的语法
Rust lifetime in Vec<&T> : convoluted syntax
我正在通过官方书籍学习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
包含对 [=14 的引用=]s,并且 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>>,
}
我正在通过官方书籍学习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
包含对 [=14 的引用=]s,并且 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>>,
}