1个不稳定版本
0.1.0 | 2022年7月2日 |
---|
#222 in 无标准库
12,358 每月下载量
用于 6 个Crates(3个直接使用)
33KB
676 行
使用lowerCamelCase而不是UpperCamelCase(PascalCase)的paste分支。
希望是暂时的。
lib.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_lowercase
和 str::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"]