函数签名缺少生命周期指定符[E0106]

11

我对这段简单代码 (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版本有什么改变吗?我该如何修复这些错误?

1个回答

19

很久以前,当函数返回一个借用指针时,编译器会推断出'static生命周期,因此fn2会成功编译。此后,实现了生命周期省略。 生命周期省略是一个过程,编译器将自动将输入参数的生命周期链接到输出值的生命周期,而无需显式命名。

例如,fn1在没有生命周期省略的情况下将被写成这样:

fn fn1<'a>(a1: &'a str) -> &'a str {
    let a = fn2();
    a
}

然而,fn2 没有借用指针或具有生命周期参数的结构体作为其参数(实际上,它根本没有参数)。因此,您必须显式地提及生命周期。由于您要返回一个字符串字面量,正确的生命周期是 'static(正如编译器建议的那样)。

fn fn2() -> &'static str {
    "12345abc"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接