当我定义以下结构时:
struct Test<'a> {
a: &'a [i64],
b: Vec<i64>,
}
切片和向量都包含指针。为什么切片需要一生,但不是矢量?
答案 0 :(得分:13)
矢量拥有其元素。这意味着向量负责分配和释放它指向的元素。向量元素的生命周期与向量本身的生命周期相同,因此无需为Vec
类型指定生命周期。
切片借用可以静态或动态分配的向量或数组的元素。切片必须指示借用元素的生命周期,以便编译器可以进行必要的安全检查。
另一种表达方式是通过比较两个选项之间的事件顺序。
对于矢量:
Vec
。最初没有为元素分配存储空间(当Vec
为空时)。Vec
存储指向该存储的指针。Vec
本身。对于切片:
修改强>
一般来说,借用指针(&'a X
)需要使用生命周期注释,包含借用指针的类型X<'a>
,其中X
是struct
或{ {1}}有一个成员是借来的指针)和特征对象/约束(enum
,其中X+'a
是X
)当这些类型被用作成员时trait
或struct
。
在enum
绑定和let
运算符的右侧,通常编写借用的指针类型而没有生命周期注释(即只as
),因为编译器会推断在这种情况下的生命。
您需要记住的是,在直接或间接处理借用指针时,终身注释是必要的。
如果您想了解有关所有权,借阅和生命周期的更多信息,建议您阅读the Rust Guide's section on pointers以及Rust References and Lifetimes Guide