这段代码无法编译,因为 Rust 要求必须添加生命周期。
fn firstNoLifetime(x: &str, y: &str) -> &str {
return x;
}
因此,我们必须显式地添加生命周期,如下所示:
fn first<'a>(x: &'a str, y: &'a str) -> &'a str {
return x;
}
那么我的问题是,没有生命周期参数的这个函数是如何编译的?
为什么通用函数不需要生命周期参数,这方面有什么注意事项吗?
fn first_generic<A>(x: A, y: A) -> A {
return x;
}
我的假设是生命周期注释可以帮助编译器和借用检查器确定生命周期违规的根本原因,但在下面的代码中,Rust 能够在没有注释的情况下确定原因。那么我的假设是错误的吗?如果是,生命周期注释的目的是什么?
fn first_generic<A>(x: A, y: A) -> A {
return x;
}
fn main() {
let string1 = String::from("long string is long");
let result: &str;
{
let string2 = String::from("xyz");
result = first_generic(string1.as_str(), string2.as_str());
}
println!("The first string is: {}", result);
}
结果:
|
10 | result = first_generic(string1.as_str(), string2.as_str());
| ^^^^^^^^^^^^^^^^ borrowed value does not live long enough
11 | }
| - `string2` dropped here while still borrowed
12 |
13 | println!("The first string is: {}", result);
| ------ borrow later used here
where T: 'a
。 - cdhowieT
根本不必是一个引用。 - cdhowie&str
类型,生命周期在泛型实例化期间不会变成必需品吗? - Willem D'HaeseleerT
。 - cdhowie