'a 语法实际上用于两种不同的情况:
第一种情况,标注循环:
fn main() {
'a: loop {
println!("{}", 3);
break 'a;
}
}
这里,'a 清楚地描述了循环体的生命周期,并允许一举打破多层循环。
第二种也是更相似的情况,是使用'a 来表示一个绑定:
fn<'a> susbtr(haystack: &'a str, offset: usize) -> &'a str;
在这种情况下,生命周期'a 并不代表变量的实际生命周期,它代表了被引用变量生命周期的绑定,并允许捆绑在一起 各种变量的界限。
请注意,调用者和被调用者对绑定的解释不同:
- 从调用者的角度来看,
'a 是一个上限,承诺返回值将至少与参数一样长(也许更长,不保证)
- 从被调用者(即
substr)的角度来看,'a 是一个下界,检查任何返回值必须存在至少一样长 em> 作为参数(可能更长,没必要)
我们可以有差异,因为边界不代表实际的生命周期,当一个边界用于多个生命周期时,编译器将简单地推断出对这种情况有意义的最低/最高边界:
- 调用者获得最低上限可行(即,最少保证)
- 调用者获得最高的下界可行(即,最小的约束)
例如:
fn<'b> either(one: &'b str, two: &'b str, flag: bool) -> &'b str {
if flag { one } else { two }
}
可以通过以下方式调用:
fn<'a> call(o: &'a str, flag: bool) -> &'a str {
either(o, "Hello, World", flag)
}
这里,o 的生命周期是未知的(有些是 'a),而 "Hello, World" 的生命周期是已知的('static),'static 的定义是生命周期中较大的一个(它为所有人而活)程序)。
-
call 的调用者只知道返回值至少与o 一样长
-
call 必须保证这一点,它将o 和"Hello, World" 提供给either,其中'b 被推断为'a 和'static 之间的最低界限(因此'a)
-
either 必须返回与它的任何一个参数一样长的东西;它不知道他们的寿命可能会有所不同,并且不在乎