函数返回类型中的匿名生命周期

Ris*_*ish 11 rust

我在查看Rust的源代码,发现了这个函数

pub fn tokenize(input: &str) -> impl Iterator<Item = Token> + '_ {
    let mut cursor = Cursor::new(input);
    std::iter::from_fn(move || {
        if cursor.is_eof() {
            None
        } else {
            cursor.reset_len_consumed();
            Some(cursor.advance_token())
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

我知道 '_ 指的是匿名生命周期,但我不确定它在这种情况下意味着什么。希望得到一些澄清。谢谢。

aed*_*edm 11

这是一个简写

pub fn tokenize<'a>(input: &'a str) -> impl Iterator<Item = Token> + 'a { ... }
Run Code Online (Sandbox Code Playgroud)

Rust 有时允许您在声明明确时避免声明生命周期:

fn foo(input: &'a str) -> &'a str { ... }
// same as
fn foo(input: &str) -> &str { ... }
Run Code Online (Sandbox Code Playgroud)

但在上面的代码中,返回类型不是引用,因此不能使用这种简写。'_是这种情况的语法糖。

但为什么也无法'_逃避呢?这是RFC 2115: argument_lifetimes的答案:

'_ 标记向读者清楚地表明正在发生借用,否则可能不清楚。