7个稳定版本
1.1.5 | 2023年6月14日 |
---|---|
1.1.4 | 2022年10月31日 |
1.1.3 | 2021年7月4日 |
1.1.2 | 2021年1月12日 |
1.0.0 | 2020年8月4日 |
#43 in 过程宏
44,932每月下载量
在 93 个crate中(直接使用48个) 使用
15KB
184 行
concat-idents!
此crate提供了一个简单易用的宏。
用法
基本用法
use concat_idents::concat_idents;
concat_idents!(fn_name = foo_, _, bar {
fn fn_name() {
// --snip--
}
});
foo__bar();
允许的标识符部分
concat_idents!(fn_name = _, __ { /* underscores */ });
concat_idents!(fn_name = foo, _bar { /* identifiers */ });
concat_idents!(fn_name = "foo", "bar" { /* strings */ });
concat_idents!(fn_name = 'f', 'o', 'o' { /* characters */ });
concat_idents!(fn_name = foo, 1, bar, 2 { /* integers */ });
concat_idents!(fn_name = true, false { /* booleans */ });
concat_idents!(fn_name = "enum", bar { /* quoted reserved keywords (recommended way) */ });
concat_idents!(fn_name = r#struct, bar { /* escaped reserved keywords (not recommended, since some keywords produce error) */ });
生成测试
macro_rules! generate_test {
($method:ident($lhs:ident, $rhs:ident)) => {
concat_idents!(test_name = $method, _, $lhs, _, $rhs {
#[test]
fn test_name() {
let _ = $lhs::default().$method($rhs::default());
}
});
};
}
#[derive(Default)]
struct S(i32);
impl Add<i32> for S {
type Output = S;
fn add(self,rhs: i32) -> Self::Output { S(self.0 + rhs) }
}
impl Sub<i32> for S {
type Output = S;
fn sub(self,rhs: i32) -> Self::Output { S(self.0 - rhs) }
}
generate_test!(add(S, i32));
generate_test!(sub(S, i32));
错误
如果传入的标识符语法意外
- 其中一个标识符无效
concat_idents!({});
concat_idents!(ident {});
concat_idents!(ident = {});
concat_idents!(= foo, bar {});
concat_idents!(ident = foo, bar);
...
- 将抛出编译错误
concat_idents!(ident = true {}); // identifiers cannot consist of only one bool
concat_idents!(ident = 1 {}); // identifiers cannot consist of only one int
concat_idents!(ident = 1, foo {}); // identifiers cannot start with an int
concat_idents!(ident = foo, 1.0 {}); // identifiers cannot contain floats
concat_idents!(ident = "enum"); // identifiers cannot consist of only one reserved keyword
concat_idents!(ident = r#struct); // identifiers cannot consist of only one reserved keyword
concat_idents!(ident = " space"); // identifiers cannot contain spaces
concat_idents!(ident = "foo-bar🧨"); // identifiers can only contain [a-zA-Z0-9_]
...
依赖项
~270–720KB
~17K SLoC