1 个不稳定版本
| 0.1.0 | 2023 年 9 月 11 日 |
|---|
#9 在 #pasting
在 traceback-error 中使用
45KB
871 行
满足所有您的标记粘贴需求的高级宏
Rust 标准库中的夜间构建版本 concat_idents! 宏因其连接的标识符只能引用现有项而臭名昭著,它们永远不能用来定义新的东西。
此存储库提供了一种灵活的方法来在宏中将标识符粘贴在一起,包括使用粘贴的标识符来定义新项。
[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 宏内部捆绑粘贴调用可能会有所帮助。
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 将 CamelCase 输入转换为 snake_case。使用 $var:camel 将 snake_case 转换为 CamelCase。这些可以组合,因此例如 $var:snake:upper 会得到 SCREAMING_CASE。
精确的 Unicode 转换由 str::to_lowercase 和 str::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许可证2.0版 或 MIT许可证 许可。除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交给此crate的任何贡献都将按上述方式双许可,不附加任何额外条款或条件。
依赖项
~48KB