在大多数情况下,Rust编译器可以推断生命周期。如果生命周期范围在运行时确定,那么它要求必须明确标记生命周期。
即使调用堆栈在调用方侧更加复杂,作用域区域在借用时被确定,因此相同的问题似乎是可能的。
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
在这里,
- 生命周期是通用的。
- 这意味着在函数结果返回后有一个与生命周期'a绑定的作用域。
- 编译器可以了解内存对于最小生命周期'a是有效的信息。
我非常好奇。 而不是使用生命周期语法,编译器不能只采用可以将生命周期'a绑定到较少的作用域区域吗?
fn main() { //larger scope
let s1 = String::from("long string is long");
{ //fewer scope
let s2 = String::from("xyz");
let result = longest(s1.as_str(), s2.as_str());
println!("The longest string is {}", result);
}
}
即使调用堆栈在调用方侧更加复杂,作用域区域在借用时被确定,因此相同的问题似乎是可能的。
fn func1<'a>(x: &'a str, y: &'a str) {
let c = String::from("hello");
let result = func2 (a,b,c)
...
}
'a
可能会消失,但目前它是必需的。它似乎也提醒人们这些生命周期的存在。 - tadmanx
或y
借用,而无需阅读代码。 - Jmb