1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2017年7月26日 |
---|
#2032 在 过程宏
52 每月下载量
用于 3 crates
25KB
527 行
Rust准引用
无需Syntex依赖的准引用,旨在与宏1.1一起使用。
[dependencies]
quote = "0.3"
#[macro_use]
extern crate quote;
什么是准引用?
准引用是一种编写代码并将其作为数据处理的方法,类似于在双引号字符串字面量内部编写代码,但更友好于您的文本编辑器或IDE。它不会妨碍语法高亮、括号匹配、缩进或自动补全,这些都是在双引号内部编写代码时可能会丢失的。
查看我在此主题上的聚会演讲,了解更多关于用例的信息。
此crate由宏1.1用例激发,但是一个通用的Rust准引用库,并非特定于过程宏。
语法
quote crate提供了一个quote!
宏,在其中您可以编写Rust代码,该代码将被打包到quote::Tokens
中,并可将其作为数据处理。您应该将quote::Tokens
视为表示Rust源代码片段。在Tokens上调用to_string()
或as_str()
,以获取源代码片段作为字符串。
在quote!
宏内部,使用#var
进行插值。任何实现了quote::ToTokens
特质的类型都可以进行插值。这包括大多数Rust原始类型以及来自syn
的大多数语法树类型。
let tokens = quote! {
struct SerializeWith #generics #where_clause {
value: &'a #field_ty,
phantom: ::std::marker::PhantomData<#item_ty>,
}
impl #generics serde::Serialize for SerializeWith #generics #where_clause {
fn serialize<S>(&self, s: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
#path(self.value, s)
}
}
SerializeWith {
value: #value,
phantom: ::std::marker::PhantomData::<#item_ty>,
}
};
使用#(...)*
或#(...),*
进行重复,这与macro_rules!
非常相似。
#(#var)*
- 无分隔符#(#var),*
- 星号前面的字符用作分隔符#( struct #var; )*
- 重复部分可以包含其他内容#( #k => println!("{}", #v), )*
- 即使是多重插值
请注意,#(#var ,)*
和 #(#var),*
之间有区别——后者不会产生尾随逗号。这与 macro_rules!
中的分隔符的行为相匹配。
令牌可以插值到其他引号中
let t = quote! { /* ... */ };
return quote! { /* ... */ #t /* ... */ };
有关利用所有这些特性的优秀示例,请查看 DeepClone
和 deep-clone-derive
。
quote!
宏依赖于深度递归,因此某些大型调用在编译时可能会因“递归限制达到”而失败。如果失败,请通过在您的crate中添加 #![recursion_limit = "128"]
来增加递归限制。对于特别大的调用,可能需要更高的限制。除非编译器告诉您需要它,否则您不需要这样做。
许可证
根据您选择的以下任一项获得许可
- Apache License,版本 2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选。
贡献
除非您明确声明,否则您提交的任何贡献,根据 Apache-2.0 许可证定义,均应双许可如上所述,无需附加条款或条件。
依赖项
~220KB