gpt4 book ai didi

rust - Rust 宏可以跨版本共享吗?

转载 作者:行者123 更新时间:2023-12-04 14:35:11 28 4
gpt4 key购买 nike

假设一个 Rust 2018 宏定义了一个 async里面的功能。它将使用的语法与 Rust 2015 不兼容。因此,如果您使用 2015 版编译您的 crate,那么宏中的扩展代码不会与它冲突吗?
我不太熟悉过程宏或声明性宏的内部工作原理,但我认为它们需要生成特定于版本的代码,因为它们的输出将被视为与其余代码相同。如果是这样,我如何跨版本边界共享宏导出。我需要在每个版本的基础上重新编写它们吗?这似乎没有可扩展性,特别是如果版本应该每 3 年左右发布一次。

最佳答案

是的,在一个版本下开发的宏可以被其他版本的代码使用。
这是作为版 native 制的一部分精心策划的,以防止生态系统停滞。特别是对于宏,Rust Edition Guide explains this更详细地:

Macros use a system called "edition hygiene" where the tokens within a macro are marked with which edition they come from. This allows external macros to be called from crates of varying editions without needing to worry about which edition it is called from.


给出了一个仅适用于 2015 版的宏示例:
#[macro_export]
macro_rules! foo {
() => {
let dyn = 1;
println!("it is {}", dyn);
};
}
这使用 dyn作为标识符,这在 Rust 2018 中是非法的。 然而,由于这个宏是在 2015 版中编写的,因此在此上下文中编写的任何代码都会根据该版本的规则进行解析和解释,与调用者的代码隔离。由于宏的这种“卫生”,它们可以在 Rust 2018、2021 或任何其他版本中无缝使用。
同样的事情也适用于在较新版本中编写的宏。即使程序宏声明了 async函数,最终有一个不依赖于这种语法的共同点( MIR )。
当然,唯一的异常(exception)是 migrating existing code between editions .

关于rust - Rust 宏可以跨版本共享吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70038007/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com