当第二个参数用 'a 注释时,第一个参数的隐式生命周期是多少?

Pau*_*erg 9 lifetime rust

在阅读Rust Book 的第 12.4 章时,我偶然发现了这个函数:

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

我理解为什么在没有contents参数和返回值的显式生命周期注释的情况下代码不能编译-生命周期省略规则不适用于具有至少两个借用参数的函数。

但我很好奇这个query论点的隐含生命周期注释是什么。我可以想到两种情况:

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

两种情况query都可以编译,因此获得生命周期'a'b. 哪一个是正确的?

Mih*_*hir 9

rustonomicon, 在终身省略下

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


您可以尝试将该函数分配给错误的类型。编译器会告诉你函数的正确类型:

let x: () = search;
Run Code Online (Sandbox Code Playgroud)

操场

结果:

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}`
Run Code Online (Sandbox Code Playgroud)

所以,你的函数类型是:

for<'r, 'a> fn(&'r str, &'a str) -> Vec<&'a str> {search}
Run Code Online (Sandbox Code Playgroud)

此外,如果query也有 life 'a,你应该能够做到这一点:

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

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

操场