4个版本

0.1.3 2022年6月13日
0.1.2 2022年6月8日
0.1.1 2022年6月8日
0.1.0 2022年6月7日

#1580过程宏

Download history 1/week @ 2024-03-14 12/week @ 2024-03-28 6/week @ 2024-04-04

每月下载 238

MIT 许可证 MIT

8KB
121 代码行

Unpattern

使用简单语法取消封装并声明模式中的变量。

有时,即使你知道枚举的确切匹配项,也需要取消枚举的封装,但你必须使用 matchif let 表达式来取消封装。

例如

enum TestEnum {
    Int(i32),
    Tuple(i32 i32),
}

let test = TestEnum::Int(3);
// You need to unbox the enum.
if let TestEnum::Int(v) = test {
    assert_eq!(v, 3);
} else {
    unreachable!();
}

此crate帮助从模式中取消枚举的封装。

let test = TestEnum::Int(3);
unpat!(TestEnum::Int(v) <- test); // `v = 3` binding is created here.
assert_eq!(v, 3);

此crate的概念灵感来自Elixir的模式匹配。

test = %Test{a: 1, b: 2}
%Test{a} = test # `a = 1` binding is created here

用法

struct TestStruct {
    int: i32,
    tuple: (i32, i32),
}

enum TestEnum {
    Int(i32),
    Tuple(i32, f64),
    Struct(TestStruct),
}

let test = TestEnum::Struct(TestStruct {
    int: 1,
    tuple: (2, 3),
});

unpat!(
    TestEnum::Struct(
        TestStruct { int, tuple: (x, y) }
    ) <- test
);
assert_eq!((int, x, y), (1, 2, 3));

此外,命名字段还可以与 @ 语法绑定。

unpat!(
    TestEnum::Struct(
        TestStruct { int, tuple: v @ (x, y) }
    ) <- test
);
assert_eq!((int, x, y), (1, 2, 3));
assert_eq!(v, (2, 3));

错误处理

unpat 如果模式不匹配则引发panic。如果您想处理错误,请使用 try_unpat 代替。

let test = TestEnum::Int(3);
try_unpat!(TestEnum::Int(v) <- test, String::from("The pattern doesn't match"));
assert_eq!(v, 3);

// The pattern doesn't match. It will return Err.
try_unpat!(TestEnum::Tuple(a, _) <- test, String::from("The pattern doesn't match"));
unreachable!()

待办事项

  • 实现所有模式
  • 插入符语法

依赖项

~1.5MB
~35K SLoC