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 在 过程宏 中
每月下载 238 次
8KB
121 代码行
Unpattern
使用简单语法取消封装并声明模式中的变量。
有时,即使你知道枚举的确切匹配项,也需要取消枚举的封装,但你必须使用 match
或 if 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!()
待办事项
- 实现所有模式
- 插入符语法
相关工作
- StackOverflow问题:#
- enum-as-inner
- RFC-349
依赖项
~1.5MB
~35K SLoC