1个不稳定版本

使用旧的Rust 2015

0.1.0 2017年7月26日

#2032过程宏

Download history 17/week @ 2024-02-19 20/week @ 2024-02-26 7/week @ 2024-03-04 8/week @ 2024-03-11

52 每月下载量
用于 3 crates

MIT/Apache

25KB
527

Rust准引用

Build Status Latest Version Rust Documentation

无需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 /* ... */ };

有关利用所有这些特性的优秀示例,请查看 DeepClonedeep-clone-derive


quote! 宏依赖于深度递归,因此某些大型调用在编译时可能会因“递归限制达到”而失败。如果失败,请通过在您的crate中添加 #![recursion_limit = "128"] 来增加递归限制。对于特别大的调用,可能需要更高的限制。除非编译器告诉您需要它,否则您不需要这样做。

许可证

根据您选择的以下任一项获得许可

任选。

贡献

除非您明确声明,否则您提交的任何贡献,根据 Apache-2.0 许可证定义,均应双许可如上所述,无需附加条款或条件。

依赖项

~220KB