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