35 个版本 (16 个稳定版)

1.0.15 2024 年 5 月 7 日
1.0.14 2023 年 7 月 15 日
1.0.12 2023 年 3 月 5 日
1.0.11 2022 年 12 月 17 日
0.1.3 2018 年 11 月 3 日

#12 in 过程宏

Download history 1290170/week @ 2024-05-02 1333354/week @ 2024-05-09 1389821/week @ 2024-05-16 1364769/week @ 2024-05-23 1487722/week @ 2024-05-30 1475887/week @ 2024-06-06 1458595/week @ 2024-06-13 1497580/week @ 2024-06-20 1484786/week @ 2024-06-27 1382639/week @ 2024-07-04 1479092/week @ 2024-07-11 1521007/week @ 2024-07-18 1572949/week @ 2024-07-25 1562830/week @ 2024-08-01 1623648/week @ 2024-08-08 1554930/week @ 2024-08-15

6,606,347 每月下载量
用于 15,408 个 Crates (1,834 直接使用)

MIT/Apache

40KB
734 代码行

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

github crates.io docs.rs build status

Rust 标准库中仅在夜间构建中可用的宏 concat_idents! 以其只能引用现有项目而无法用于定义新内容而著称。

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

[dependencies]
paste = "1.0"

此方法与任何 1.31+ 版本的 Rust 编译器兼容。


粘贴标识符

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

更复杂的示例

下面的示例展示了如何生成一些结构体字段的访问器方法的宏。它演示了您如何在 macro_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 将插值段转换为小写或大写,作为粘贴的一部分。例如,如果用 $reg=Bc 调用,则 [<ld_ $reg:lower _expr>] 将粘贴为 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 paste::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 License, Version 2.0 或 MIT 许可协议。Apache 许可协议,版本 2.0MIT 许可协议
除非您明确声明,否则您提交给此软件包的任何有意贡献,根据 Apache-2.0 许可协议定义,应如上所述双重许可,不附加任何额外条款或条件。

无运行时依赖