我查看了Rust的源代码,发现了this function个.

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())
        }
    })
}

我理解"u"指的是anonymous lifetime,但我不确定在这种情况下它是什么意思.希望得到一些澄清.谢谢

推荐答案

这是一个缩写

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人的答案:

"u"标记向读者清楚地表明,借贷正在发生,否则可能不清楚.

Rust相关问答推荐

将已知大小的切片合并成一个数组,

当Option为None时,Option数组是否占用Rust中的内存?

访问Rust中的隐藏变量

使用 struct 外部的属性来改变 struct 的原始方式

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

取得本地对象字段的所有权

当我编译 Rust 代码时,我是否缺少 AVX512 的目标功能?

为什么`tokio::main`可以直接使用而不需要任何导入?

如何迭代存储在 struct 中的字符串向量而不移动它们?

如何正确使用git2::Remote::push?

Google chrome 和 Apple M1 中的计算着色器

如何基于常量在Rust中跳过一个测试

无法将`&Vec>`转换为`&[&str]`

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

`移动||异步移动{...}`,如何知道哪个移动正在移动哪个?

如何连接 Rust 中的相邻切片

是否可以预测堆栈溢出?

为什么会出现无法移出可变引用后面的 `self.x`错误?

在 Rust 中为泛型 struct 编写一次特征绑定

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用