3 个版本 (稳定)
1.0.1 | 2021 年 1 月 9 日 |
---|---|
1.0.0 | 2020 年 11 月 8 日 |
0.1.0-dev | 2020 年 11 月 8 日 |
#1272 在 Rust 模式
59 每月下载次数
在 2 个包中使用(通过 clashctl-tui)
8KB
match_any
提供了一种声明性宏,它将表达式与任何模式匹配并执行任何匹配的表达式分支。
此宏允许您通过为每个模式创建相同的匹配分支来使用相同的表达式分支处理不同类型。标准匹配语句仅允许相同类型的模式这样做。
let result: Result<i64, i32> = Err(42);
let int: i64 = match result { Ok(i) | Err(i) => i.into() }; // does not compile!
let result: Result<i64, i32> = Err(42);
let int: i64 = match_any!(result, Ok(i) | Err(i) => i.into()); // compiles just fine
assert_eq!(int, 42);
安装
[dependencies]
match_any = "1"
示例
use match_any::match_any;
enum Id { U8(u8), I16(i16), I32(i32) }
use Id::*;
let id = Id::I16(-2);
let id: i32 = match_any!(id, U8(x) | I16(x) | I32(x) => x.into());
assert_eq!(id, -2);
枚举分发
类似于 enum_dispatch 包,此宏可用于实现“枚举分发”,作为动态分发的替代方案。与 enum_dispatch 包相比,此宏的主要区别在于,enum_dispatch 提供了一个 过程性 宏,而这是一个 声明性 宏。这使得 enum_dispatch 比 match_any 能够减少更多的样板代码。然而,match_any 的 IDE 支持应该会更好。
枚举分发示例
use match_any::match_any;
trait IntId {
fn int_id(&self) -> i32;
}
impl IntId for u64 {
fn int_id(&self) -> i32 { 64 }
}
impl IntId for u32 {
fn int_id(&self) -> i32 { 32 }
}
enum IntIdKind { U64(u64), U32(u32) }
impl IntId for IntIdKind {
fn int_id(&self) -> i32 {
use IntIdKind::*;
match_any!(self, U64(i) | U32(i) => i.int_id())
}
}
let int_id_kind = IntIdKind::U32(0);
assert_eq!(int_id_kind.int_id(), 32); // enum dispatch
let int_id_box: Box<dyn IntId> = Box::new(0_u32);
assert_eq!(int_id_box.int_id(), 32); // dynamic dispatch
许可证
该项目受以下任一许可证的许可:
- Apache 许可证 2.0 版,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则任何有意提交给 match_any 的贡献,根据 Apache-2.0 许可证的定义,都应按上述方式双许可,不附加任何其他条款或条件。