我对这个简单代码(Playground)中的错误感到很困惑:
fn main() {
let a = fn1("test123");
}
fn fn1(a1: &str) -> &str {
let a = fn2();
a
}
fn fn2() -> &str {
"12345abc"
}
这些是:
error[E0106]: missing lifetime specifier
--> <anon>:10:13
|
10 | fn fn2() -> &str {
| ^ expected lifetime parameter
|
= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
= help: consider giving it a 'static lifetime
我之前没有遇到过这些错误,最近的Rust版本有什么变化吗?如何修复错误?
答案 0 :(得分:14)
很久以前,当函数返回一个借来的指针时,编译器推断出'static
生命周期,因此fn2
将成功编译。从那时起,终身省略已经实施。 Lifetime elision是一个过程,编译器会自动将输入参数的生命周期链接到输出值的生命周期,而不必明确命名。
例如,没有终身省略的fn1
将被写成:
fn fn1<'a>(a1: &'a str) -> &'a str {
let a = fn2();
a
}
但是,fn2
没有带有生命参数的借用指针或结构的参数(实际上,它根本没有参数)。因此,您必须明确提及生命周期。由于您正在返回字符串文字,因此正确的生命周期为'static
(正如编译器所建议的那样)。
fn fn2() -> &'static str {
"12345abc"
}