3 个不稳定版本
0.2.0 | 2024年3月1日 |
---|---|
0.1.1 | 2022年1月18日 |
0.1.0 | 2022年1月3日 |
2138 在 Rust 模式 中排名
每月下载量 6,808
在 5 个crate中使用(其中3个直接使用)5 个crate
19KB
399 行
从 try into 导出枚举
为枚举实现 From 和 TryInto
use derive_enum_from_into::{EnumFrom, EnumTryInto};
use std::convert::TryInto;
#[derive(EnumFrom, EnumTryInto, PartialEq, Debug)]
enum Enum1 {
A(i32),
B,
}
assert_eq!(
Enum1::from(54i32),
Enum1::A(54i32)
);
let num: Result<i32, _> = Enum1::B.try_into();
assert!(num.is_err());
忽略具有重复类型定义或命名字段的变体
use derive_enum_from_into::{EnumFrom, EnumTryInto};
use std::convert::TryInto;
#[derive(EnumFrom, EnumTryInto, PartialEq, Debug)]
enum Enum1 {
A(String),
B(String),
C {
something: bool
},
}
// Results in compile errors
let enum1: Result<String, _> = Enum1::A("Hello".to_owned()).try_into();
let enum1: Result<bool, _> = (Enum1::C { something: true }).try_into();
From
可以忽略带有 #[from_ignore]
的变体
TryInto
还可以为枚举的引用实现。可以使用 #[try_into_ignore]
忽略特定变体
use derive_enum_from_into::{EnumFrom, EnumTryInto};
use std::convert::TryInto;
#[derive(EnumTryInto, PartialEq, Debug)]
#[try_into_references(&, &mut, owned)]
enum NumberOrString {
Number(f32),
#[try_into_ignore]
String(String)
}
let x = NumberOrString::Number(4.);
assert_eq!(TryInto::<&f32>::try_into(&x), Ok(&4.));
// This won't compile as cannot TryInto String
// assert!(TryInto::<String>::try_into(NumberOrString::String("Hello World".to_owned())).is_err());
// `TryInto` comes in handy for `filter_map` cases
fn filter_only_f32s(iter: impl Iterator<Item=NumberOrString>) -> impl Iterator<Item=f32> {
iter.filter_map(|item| item.try_into().ok())
}
// `TryInto` returns `self` if it does not match
assert_eq!(TryInto::<f32>::try_into(NumberOrString::String("Hello World".to_owned())), Err(NumberOrString::String("Hello World".to_owned())));
请注意,由于 TryInto
的默认实现,以下代码将无法编译。可以使用将 X 包裹在 newtype 模式中的方法来解决这个问题。
#[derive(derive_enum_from_into::EnumTryInto)]
enum X {
Leaf(i32),
Nested(X)
}
依赖关系
~280–730KB
~17K SLoC