从 Rust 编程语言书,我到达了生命周期的章节。我不明白为什么 Rust 编译器很难自动为函数参数提供所传递参数的最短生命周期。
例子:
fn main() {
let string1 = String::from("abcd");
let string2 = "xyz";
let result = longest(string1.as_str(), string2);
println!("The longest string is {}", result);
}
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
} else {
y
}
}
Rust 会抱怨生命周期注释,我将不得不写下以下内容:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {...}
这将导致给出最短的寿命。如果 Rust 可以自动知道最短生命周期并将其分配给
'a
那么我为什么要手动注释函数签名?
换句话说,为什么 Rust 编译器不通过查看传递的参数
string1
和 string2
来选择最短的生命周期,并将最短的生命周期分配给 'a
?
附言我假设您将始终拥有相等的生命周期(如本示例)或一个生命周期缩进另一个生命周期,在这种情况下,您会希望最短的生命周期避免悬空引用。
我也在学rust,刚看了lifetimes那一章,欢迎指正。
我也有和你一样的问题。为什么不取最短寿命呢?但是再看看这个例子。
fn main() {
let x = 1;
let a;
{
let y = 2;
a = something(&x, &y);
}
println!("{a}");
}
fn something<'a>(q: &'a i32, w: &'_ i32) -> &'a i32 {
println!("{w}");
return q;
}
在这方面我并不真正关心
y
的生命周期。就我而言,我只需要y
来做一些临时工作(比如打印)。我真正关心的是x
。因为我要退货了。
如果编译器在我的函数中为
'a
假定相同的生命周期(w
),代码将不会编译,因为我在删除a
后使用返回值y
。