现在,proc_macros
have been stabilized,一个人如何创造这样的东西?
根据我所看到的,可以在fn whatsitsname(attrs: TokenStream, code: TokenStream) -> TokenStream
上添加#[proc_macro_attribute]
注解,但是我如何注册它呢?如何添加自定义属性?
现在,proc_macros
have been stabilized,一个人如何创造这样的东西?
根据我所看到的,可以在fn whatsitsname(attrs: TokenStream, code: TokenStream) -> TokenStream
上添加#[proc_macro_attribute]
注解,但是我如何注册它呢?如何添加自定义属性?
2条答案
按热度按时间ndasle7k1#
Rust编译器有一个相当完整的test suite。当寻找新引入的功能的例子时,我经常从那里开始:
下面是一个完整的工作示例:
货物清单
我们在宏定义的crate上添加一个依赖项。
**src/ www.example.com 我们
我们导入属性宏并将其添加到函数中。
my_macro/Cargo。toml
我们将
crate_type
指定为proc_macro
。**my_macro/src/ www.example.com 我们
我们将
#[proc_macro_attribute]
添加到每个应该是宏的函数中。货物运行
“困难”的部分是将
TokenStream
转换成有用的东西,然后输出同样有用的东西。板条箱syn和quote是这两项任务的当前黄金标准。处理TokenStream
在macros chapter of The Rust Programming Language和API documentation中有介绍。还有
#[proc_macro]
,它接受以下形式的函数:并且可以作为
the_name_of_the_macro!(...)
调用。3ks5zfa02#
如果我正确理解了RFC 1566,您:
proc_macro
类型的crate,i。即其Cargo.toml
应该包含#[proc_macro_attribute]
注解的实现。用于类函数宏的#[proc_macro]
和用于自定义派生的#[proc_macro_derive]
工作原理相同,只是它们只有一个TokenStream
参数。这些在proc_macro
crate中定义。第一个标记流是属性中的参数,第二个标记流是注解项的主体。
#[macro_use]
属性(#[macro_use] extern crate
...).应该够了
书中的附录应该扩展到提到
#[proc_macro_derive]
之外的其他proc宏类型。它没有可能是一个bug。