原始生命周期

摘要

  • 'r#ident_or_keyword 现在被允许作为生命周期,这允许使用诸如 'r#fn 之类的关键字。

详情

原始生命周期在 2021 版本中引入,以支持迁移到引入新关键字的较新版本的能力。这类似于原始标识符,它为标识符提供了相同的功能。例如,2024 版本引入了 gen 关键字。由于生命周期不能是关键字,这将导致使用生命周期 'gen 的代码无法编译。原始生命周期允许迁移 lint 将这些生命周期修改为 'r#gen,这确实允许关键字。

在 2021 之前的版本中,原始生命周期被解析为单独的标记。例如,'r#foo 被解析为三个标记:'r#foo

迁移

作为 2021 版本的一部分,添加了一个迁移 lint,rust_2021_prefixes_incompatible_syntax,以帮助自动将 Rust 2018 代码库迁移到 Rust 2021。

为了使您的代码与 Rust 2021 版本兼容,请运行

cargo fix --edition

如果您想或需要手动迁移您的代码,迁移非常简单。

假设您有一个宏定义如下

#![allow(unused)]
fn main() {
macro_rules! my_macro {
    ($a:tt $b:tt $c:tt) => {};
}
}

在 Rust 2015 和 2018 中,可以合法地调用此宏,标记之间没有空格

my_macro!('r#foo);

在 2021 版本中,这现在被解析为单个标记。为了调用此宏,您必须在标识符前添加空格,如下所示

my_macro!('r# foo);