#paste #macro #pasting #fork #token #case #changing

affix

满足您所有标记粘贴需求的自定义宏。基于 https://github.com/dtolnay/paste,并修复了大写问题。

2 个版本

0.1.2 2022年2月16日
0.1.1 2022年2月16日
0.1.0 2022年2月16日

1294过程宏 中排名

Download history 562/week @ 2024-04-19 530/week @ 2024-04-26 623/week @ 2024-05-03 503/week @ 2024-05-10 597/week @ 2024-05-17 631/week @ 2024-05-24 997/week @ 2024-05-31 491/week @ 2024-06-07 540/week @ 2024-06-14 891/week @ 2024-06-21 640/week @ 2024-06-28 1653/week @ 2024-07-05 811/week @ 2024-07-12 723/week @ 2024-07-19 777/week @ 2024-07-26 543/week @ 2024-08-02

3,181 每月下载次数
5 库(3 个直接)使用

MIT/Apache

35KB
634

满足您所有标记粘贴需求的自定义宏

这个crate是基于 paste 的分支,增加了增强的大小写转换功能。

Rust标准库中的 nightly-only concat_idents! 宏在将标识符连接在一起方面非常有限,因为它的连接标识符只能引用现有项,而不能用来定义新内容。

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

[dependencies]
affix = "0.1"

此方法适用于任何1.31+版本的Rust编译器。


粘贴标识符

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

use affix::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,
    );
}

更详细的示例

以下示例显示了一个生成结构体字段的访问器方法的宏。它演示了您如何在 macro_rules 宏内部捆绑 paste 调用可能会非常有用。

use affix::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 将插值段转换为小写或大写,作为粘贴的一部分。例如,如果调用 [<ld_ $reg:lower _expr>] 并将 $reg 设置为 Bc,则将其粘贴为 ld_bc_expr

使用 $var:snake 将驼峰式输入转换为 snake_case。使用 $var:camel 将 snake_case 转换为驼峰式。这些操作可以组合使用,例如 $var:snake:upper 会生成 SCREAMING_CASE。

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


粘贴文档字符串

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

use affix::paste;

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

pub struct Paste {}

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

许可证

您可以选择根据 Apache 许可证 2.0 版MIT 许可证
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交给此软件包的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。

依赖项

~79KB