原始生命周期
摘要
'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);