我对这个简单代码(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

我以前从未遇到过这些错误,最近的版本有什么变化吗?我如何修复错误?

推荐答案

很久以前,当一个函数返回一个borrow 的指针时,编译器推断出'static生存期,因此fn2将成功编译.从那时起,终身省略已经实现.生存期省略是一个过程,编译器将自动将输入参数的生存期链接到输出值的生存期,而无需显式命名.

例如,如果没有终身省略,fn1应该这样写:

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

但是,fn2没有borrow 的指针或具有生存期参数的 struct 的参数(实际上,它根本没有参数).因此,你必须明确提到生命.因为返回的是字符串文字,所以正确的生存期是'static(正如编译器所建议的).

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

Rust相关问答推荐

使用InlineTables序列化toml ArrayOfTables

为什么函数不接受选项T参数的所有权?

使用模块中的所有模块,但不包括特定模块

什么时候铁 rust FFI边界上的panic 是未定义的行为?

如何创建一个可变的嵌套迭代器?

无法将 rust 蚀向量附加到另一个向量

在Rust内联程序集中使用字符串常量

如何在Rust中基于字符串 Select struct ?

如何执行数组文字的编译时串联?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

在 Rust 中查找向量中 dyn struct 的索引

如何在 Rust 的 Hyper 异步闭包中从外部范围正确读取字符串值

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

Rust 将特性传递给依赖项

Rust 中函数的类型同义词

使用 serde_json 进一步处理字段

如何使用 rust bindgen 生成的 std_vector

用逗号分隔字符串,但在标记中使用逗号

如何构建包含本地依赖项的 docker 镜像?

如何迭代调用可能会失败的函数?操作员?