#paste #camel-case #fork #temporary #hopefully #macro #lower-camel-case

无标准库 camelpaste

使用lowerCamelCase的paste的分支(希望是暂时的)

1个不稳定版本

0.1.0 2022年7月2日

#222 in 无标准库

Download history 2541/week @ 2024-03-14 4097/week @ 2024-03-21 3301/week @ 2024-03-28 2826/week @ 2024-04-04 2754/week @ 2024-04-11 3274/week @ 2024-04-18 2857/week @ 2024-04-25 2992/week @ 2024-05-02 2807/week @ 2024-05-09 2790/week @ 2024-05-16 1855/week @ 2024-05-23 3258/week @ 2024-05-30 3769/week @ 2024-06-06 2635/week @ 2024-06-13 3138/week @ 2024-06-20 2350/week @ 2024-06-27

12,358 每月下载量
用于 6 个Crates(3个直接使用)

MIT/Apache

33KB
676

使用lowerCamelCase而不是UpperCamelCase(PascalCase)的paste分支。

希望是暂时的。


lib.rs:

githubcrates-iodocs-rs


Rust标准库中每晚仅有的concat_idents!宏在合并标识符方面非常薄弱,其合并的标识符只能引用现有项,永远不能用来定义新项。

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

此方法适用于任何Rust编译器1.31及以上版本。


粘贴标识符

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

use camelpaste::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 camelpaste::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 camelpaste::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"]

无运行时依赖