在大多数情况下,Rust 编译器可以推断生命周期。如果生命周期范围是在运行时确定的,则表示必须显式标记生命周期。
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
Run Code Online (Sandbox Code Playgroud)
这里,
我很好奇。编译器不能不使用生命周期语法,而是采用生命周期 '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);
}
}
Run Code Online (Sandbox Code Playgroud)
即使调用方的调用堆栈更复杂,作用域区域也是在借用时确定的,所以同样的问题似乎是可能的。
fn func1<'a>(x: &'a str, y: &'a str) {
let c = String::from("hello");
let …Run Code Online (Sandbox Code Playgroud)