澄清 Rust 生命周期语法
Clarification on Rust lifetime syntax
我在处理 Rust 生命周期时看到的典型示例是以下函数:
pub fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
有趣的是,这似乎转化为“longest()
结果的生命周期是其输入参数的最短生命周期”。逻辑对我来说很有意义,但我不明白如何这是通过语法传达的。
当我查看该函数时,它看起来只有一个生命周期 'a
并且该函数似乎强制执行 x
和 y
必须具有 exact 相同的生命周期 'a
因此结果必须具有相同的生命周期 'a
.
我不确定这种语法是否本质上是我所看到的语法糖。如果我被允许冗长,那么我认为语法看起来像(我知道这不是正确的语法):
pub fn longest<'a, 'b>(x: &'a str, y: &'b str) -> min('a, 'b) str {
if x.len() > y.len() {
x
} else {
y
}
}
我理解正确还是我误解了语言?
'a
的生命周期参数意味着引用需要至少 生命周期 'a
。传入一个持续时间超过 'a
.
的引用是可以的
调用函数longest()
时,编译器需要根据传入的具体参数推断出生命周期'a
。编译器足够聪明,可以将此生命周期推断为x
和 y
的实际生命周期,确保每个参数都满足生命周期界限。
从本质上讲,这意味着您的解释是正确的。
如我所见,如下:
pub fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
语句fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
- 将单个生命周期标签
'a
引入函数范围
- 将引用参数
x
和 y
所针对的两个未命名字符串切片的 最短剩余生命周期 标记为生命周期标签 'a
。现在 'a
有一个约束。
- returns 对未命名字符串切片的引用,保证只要
'a
存在。编译器现在将确保调用者不会假定结果的寿命比它提供的参数的最短寿命长。
注:
- 生命周期标签与引用的目标相关联,而不是引用本身。即参考文献被读作
& (description of the thing referenced such as its lifetime, type, etc.)
.
- 引用是用于访问其目标的基本内容,并且仅在其目标处于活动状态时才有效。因此,它本质上假定引用的生命周期永远不会超过目标的生命周期,因此不需要指定(除非它成为引用本身的目标)。
- 生命周期由程序流程决定。标签只是表面上已经存在的东西,以允许表达关系(要求和保证)。在其他语言中,此类约束是不可见的,并且不会被编译器检查。当然,编译器可以拒绝有效程序,但它永远不会接受无效程序。
我在处理 Rust 生命周期时看到的典型示例是以下函数:
pub fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
有趣的是,这似乎转化为“longest()
结果的生命周期是其输入参数的最短生命周期”。逻辑对我来说很有意义,但我不明白如何这是通过语法传达的。
当我查看该函数时,它看起来只有一个生命周期 'a
并且该函数似乎强制执行 x
和 y
必须具有 exact 相同的生命周期 'a
因此结果必须具有相同的生命周期 'a
.
我不确定这种语法是否本质上是我所看到的语法糖。如果我被允许冗长,那么我认为语法看起来像(我知道这不是正确的语法):
pub fn longest<'a, 'b>(x: &'a str, y: &'b str) -> min('a, 'b) str {
if x.len() > y.len() {
x
} else {
y
}
}
我理解正确还是我误解了语言?
'a
的生命周期参数意味着引用需要至少 生命周期 'a
。传入一个持续时间超过 'a
.
调用函数longest()
时,编译器需要根据传入的具体参数推断出生命周期'a
。编译器足够聪明,可以将此生命周期推断为x
和 y
的实际生命周期,确保每个参数都满足生命周期界限。
从本质上讲,这意味着您的解释是正确的。
如我所见,如下:
pub fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
语句fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
- 将单个生命周期标签
'a
引入函数范围 - 将引用参数
x
和y
所针对的两个未命名字符串切片的 最短剩余生命周期 标记为生命周期标签'a
。现在'a
有一个约束。 - returns 对未命名字符串切片的引用,保证只要
'a
存在。编译器现在将确保调用者不会假定结果的寿命比它提供的参数的最短寿命长。
注:
- 生命周期标签与引用的目标相关联,而不是引用本身。即参考文献被读作
& (description of the thing referenced such as its lifetime, type, etc.)
. - 引用是用于访问其目标的基本内容,并且仅在其目标处于活动状态时才有效。因此,它本质上假定引用的生命周期永远不会超过目标的生命周期,因此不需要指定(除非它成为引用本身的目标)。
- 生命周期由程序流程决定。标签只是表面上已经存在的东西,以允许表达关系(要求和保证)。在其他语言中,此类约束是不可见的,并且不会被编译器检查。当然,编译器可以拒绝有效程序,但它永远不会接受无效程序。