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

11

我在查看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())
        }
    })
}

我理解 '_' 指代的是匿名生命周期,但我不确定在这个上下文中它的含义。很希望能够得到一些澄清。谢谢。


1
它的生命周期与输入引用相同。 - Stargateur
1个回答

11

它是一个简写形式

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

有时候,Rust会在声明明确的情况下允许你避免声明生命周期:
fn foo(input: &'a str) -> &'a str { ... }
// same as
fn foo(input: &str) -> &str { ... }

但是在上面的代码中,返回类型不是引用,所以这个简写不能使用。'_ 是这种情况的一种语法糖。
但是为什么 '_' 也不能省略呢?这里有一个来自RFC 2115: argument_lifetimes的答案:
“'_' 标记清楚地告诉读者借用正在发生,否则可能不明确。”

1
我不理解为什么你需要在这里指定一个生命周期,因为你并没有返回一个引用。你能更好地解释一下吗? - Kill KRT
你实际上是在返回一个引用,但它被包装在一个“迭代器”中。 - aedm
我不明白为什么会返回一个引用(在某种程度上),因为该方法似乎返回实现了Iterator特质的结构体FromFn的实例。如果我理解正确,impl Iterator意味着“实现了Iterator特质的东西,我懒得打字(并让编译器为您推断)”。 - Kill KRT

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