在阅读《铁 rust 书》Chapter 12.4篇时,我偶然发现了这个功能:

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    vec![]
}

我理解为什么代码在没有contents参数和返回值的显式生命周期注释的情况下无法编译——lifetime elision rules不适用于至少有两个borrow 参数的函数.

但我很好奇query参数的隐式生命周期 注释是什么.我可以想到两种情况:

// Scenario 1
pub fn search<'a>(query: &'a str, contents: &'a str) -> Vec<&'a str> {
    vec![]
}
// Scenario 2
pub fn search<'a, 'b>(query: &'b str, contents: &'a str) -> Vec<&'a str> {
    vec![]
}

这两种情况都可以编译,所以query可以得到生存期'a'b.哪一个是正确的?

推荐答案

rustonomicon开始,lifetime elision岁以下:

输入位置的每个省略生命周期 都成为一个不同的生命周期 参数.


您可以try 将函数分配到错误的类型.编译器将告诉您函数的正确类型:

let x: () = search;

Playground

结果:

error[E0308]: mismatched types
 --> src/main.rs:6:17
  |
6 |     let x: () = search;
  |            --   ^^^^^^ expected `()`, found fn item
  |            |
  |            expected due to this
  |
  = note: expected unit type `()`
               found fn item `for<'r, 'a> fn(&'r str, &'a str) -> Vec<&'a str> {search}`

所以,你的函数类型是:

for<'r, 'a> fn(&'r str, &'a str) -> Vec<&'a str> {search}

此外,如果query也有生命周期 'a,你应该能够做到:

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    vec![query]
}

但这无法编译,因为query的生命周期 不是'a.

Playground

Rust相关问答推荐

属性宏修改派生宏的派生实现

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

两个相关特征的冲突实现错误

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

编译项目期间使用Cargo生成时出现rustc错误

完全匹配包含大小写的整数范围(&Q;)

更合理的方法来设计样条线函数器?

将Vec<;U8&>转换为Vec<;{Float}&>

为什么在 Allocator API 中 allocate() 使用 `[u8]` 而 deallocate 使用 `u8` ?

为什么是&mut发送?线程如何在安全的 Rust 中捕获 &mut?

为什么Rust编译器会忽略模板参数应具有静态生命周期?

一旦令牌作为文字使用,声明宏不匹配硬编码值?

实现泛型的 Trait 方法中的文字

Rust 中的生命周期:borrow 的 mut 数据

一个函数调用会产生双重borrow 错误,而另一个则不会

将一片字节复制到一个大小不匹配的数组中

如何将切片推入数组?

Abortable:悬而未决的期货?

如何在不设置精度的情况下打印浮点数时保持尾随零?