#paste #macro #token #pasting #aorist #pasted #change

无标准库 aorist_paste

paste模块的分支:(v 1.0.4),对inflector行为做了一些小修改。除非使用aorist项目,否则不要使用。

1个不稳定版本

0.0.1 2021年7月23日

#7#aorist

44 每月下载量
6 个crate(5个直接使用) 中使用

MIT/Apache

37KB
624 代码行(不含注释)

满足您所有token粘贴需求的宏

github crates.io docs.rs build status

Rust标准库中仅在nightly构建中可用的concat_idents!宏因其只能引用现有项而不能定义新项而闻名。

此crate提供了一个灵活的方式来在宏中粘贴标识符,包括使用粘贴的标识符来定义新项。

[dependencies]
paste = "1.0"

这种方法适用于任何Rust编译器1.31+。


粘贴标识符

paste!宏中,位于[<...>]内的标识符将被粘贴在一起形成一个单一的标识符。

use paste::paste;

paste! {
    // Defines a const called `QRST`.
    const [<Q R S T>]: &str = "success!";
}

fn main() {
    assert_eq!(
        paste! { [<Q R S T>].len() },
        8,
    );
}

更详细的示例

下一个示例显示了一个宏,它为某些结构体的字段生成访问器方法。它展示了在宏_rules宏内捆绑paste调用的可能用途。

use paste::paste;

macro_rules! make_a_struct_and_getters {
    ($name:ident { $($field:ident),* }) => {
        // Define a struct. This expands to:
        //
        //     pub struct S {
        //         a: String,
        //         b: String,
        //         c: String,
        //     }
        pub struct $name {
            $(
                $field: String,
            )*
        }

        // Build an impl block with getters. This expands to:
        //
        //     impl S {
        //         pub fn get_a(&self) -> &str { &self.a }
        //         pub fn get_b(&self) -> &str { &self.b }
        //         pub fn get_c(&self) -> &str { &self.c }
        //     }
        paste! {
            impl $name {
                $(
                    pub fn [<get_ $field>](&self) -> &str {
                        &self.$field
                    }
                )*
            }
        }
    }
}

make_a_struct_and_getters!(S { a, b, c });

fn call_some_getters(s: &S) -> bool {
    s.get_a() == s.get_b() && s.get_c().is_empty()
}

大小写转换

在段列表中使用$var:lower$var:upper将插值的段转换为小写或大写作为paste的一部分。例如,当调用[<ld_ $reg:lower _expr>]时,如果$reg=Bc,则粘贴为ld_bc_expr

使用 $var:snake 将 CamelCase 输入转换为 snake_case。使用 $var:camel 将 snake_case 转换为 CamelCase。这些可以组合使用,例如 $var:snake:upper 将得到 SCREAMING_CASE。

精确的 Unicode 转换是由 str::to_lowercasestr::to_uppercase 定义的。


粘贴文档字符串

paste! 宏中,#[doc ...] 属性的参数会被隐式连接起来,形成一个连贯的文档字符串。

use paste::paste;

macro_rules! method_new {
    ($ret:ident) => {
        paste! {
            #[doc = "Create a new `" $ret "` object."]
            pub fn new() -> $ret { todo!() }
        }
    };
}

method_new!(Paste);  // expands to #[doc = "Create a new `Paste` object"]

许可

根据您的选择,许可协议为 Apache License, Version 2.0 或 MIT 许可证。
除非您明确说明,否则您根据 Apache-2.0 许可证定义的任何有意提交以包含在此包中的贡献,将如上双许可,不附加任何额外条款或条件。

依赖项

~170KB