当前位置:  开发笔记 > 后端 > 正文

有哪些类型的宏/语法扩展/编译器插件?

如何解决《有哪些类型的宏/语法扩展/编译器插件?》经验,为你挑选了1个好方法。

我很困惑Rust生态系统中用于几个宏观事物的许多术语.有人可以澄清一下哪些宏/语法扩展/编译器插件以及解释这些术语之间的关系?



1> Lukas Kalber..:

你是对的:它混乱.特别是,因为大多数这些功能都不稳定并经常变化.但我会尝试总结一下目前的情况(2016年12月).


维恩图显示编译器插件和语法扩展

让我们从语法扩展开始:为了产生任何影响,必须手动"调用"或注释.有三种语法扩展,它们在注释它们的方式上有所不同:

类似函数的语法扩展:这些可能是最常见的语法扩展,也称为"宏".调用它们的语法是foo!(…)或(这是非常罕见的)foo! some_ident (…),foo宏的名称在哪里.请注意,()括号可以替换为[]{}.类似函数的语法扩展可以定义为" 按示例宏 "或" 过程宏 ".

类似属性的语法扩展:这些是#[foo(…)]在不需要括号的地方调用的,并且同样foo是语法扩展名.然后,可以通过其他项(装饰器)修改或扩展属性所属的项.

自定义派生:大多数Rust程序员已经使用了该#[derive(…)]属性.当然,derive它本身可以被视为类似属性的语法扩展.但它也可以被扩展,然后调用一样#[derive(Foo)],这里Foo是名自定义导出.


这些语法扩展中的大多数也是" 编译器插件 ".唯一的例外是类似函数的语法扩展,它们通过" 宏示例 "(意思是macro_rules!语法)定义.可以在源代码中定义宏示例,而无需编写任何编译器插件.

但也有编译器插件不是语法扩展.这些类型的编译器插件是linters或其他插件,它们在编译过程的某个阶段运行一些代码.它们不需要手动调用:一旦加载,编译器将在编译期间的某些点调用它们.

所有编译器插件都需要加载 - 通过#![plugin(foo)]crate-root或-Zextra-plugins=too,bar命令行参数 - 才能产生任何效果!

编译器插件目前不稳定,因此您需要使用nightly-compiler来使用它们.但是"宏1.1"-RFC很快就会稳定下来,这意味着编译器插件的一小部分子集可以与稳定的编译器一起使用.


有用的链接:

有关注册编译器插件的文档

预订有关编译器插件的章节

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有