#编译时 #表达式 # #匹配 #不同 #字符串 #输入

match_type

在编译时对表达式的类型进行匹配

6个版本

0.1.5 2023年8月7日
0.1.4 2023年8月1日
0.1.2 2023年7月31日

过程宏中排名第687

Download history 1/week @ 2024-06-27 36/week @ 2024-07-04 30/week @ 2024-07-25

每月下载量66

MIT许可证

13KB
138

Match Type

Docs.rsLib.rsCrates.io

在编译时对表达式的类型进行匹配。

例如以下宏将根据输入表达式的类型展开为不同的String表达式

struct A(i64,i32,i16,i8);
struct B(f64,f32,bool);

macro_rules! as_string {
    ($e:expr) => {
        match_type!(
            $e {
                A => String: "It's an A :O".into(),
                B => String: "B it is ^^".into(),
                <T: Display> T => String: format!("{}", self),
                <T: Debug> T => String: format!("{:?}", self),
                _ => String: "<<Sad Monkey :(>>".into(),
            }
        )
    }
}

或者这个宏将给出值的“相反数”,使用不同的操作取决于哪些被支持(在-的情况下,如果两者都支持!-

macro_rules! opposite {
    ($e:expr) => {
        match_type!(
            $e {
                <T: Neg> T => <T as Neg>::Output: -self,
                <T: Not> T => <T as Not>::Output: !self,
            }
        )
    };
}

请注意,不同匹配分支的右侧不必是同一类型。

性能

在至少opt-level1的情况下,例如在默认的release配置文件中,整个match_type展开应该内联到汇编输出与直接编写匹配分支右侧相同。也就是说,match_type应该没有生产运行时开销。

如何?

HOW.md

依赖

~260–710KB
~17K SLoC