#枚举 #derive #单个 #字段 #try-into #转换 #变体

derive-enum-from-into

为具有单个字段的枚举实现 From 和 TryInto

3 个不稳定版本

0.2.0 2024年3月1日
0.1.1 2022年1月18日
0.1.0 2022年1月3日

2138Rust 模式 中排名

Download history 2139/week @ 2024-04-06 2315/week @ 2024-04-13 2006/week @ 2024-04-20 1918/week @ 2024-04-27 2381/week @ 2024-05-04 2328/week @ 2024-05-11 2064/week @ 2024-05-18 2139/week @ 2024-05-25 3097/week @ 2024-06-01 2117/week @ 2024-06-08 2739/week @ 2024-06-15 1611/week @ 2024-06-22 1752/week @ 2024-06-29 1864/week @ 2024-07-06 1723/week @ 2024-07-13 1265/week @ 2024-07-20

每月下载量 6,808
5 个crate中使用(其中3个直接使用)5 个crate

MIT 许可证

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