Rust 使用From trait触发将u8转换为枚举

Rust 使用From trait触发将u8转换为枚举,rust,Rust,我有以下代码: #[派生(PartialEq,PartialOrd)] 枚举值类型{ k1, k2, 众所周知, } impl值类型{ fn值(&self)->u8{ 匹配自我{ ValueType::k1=>0x0, ValueType::k2=>0x1, ValueType::kUnknown=>0xff, } } } ValueType的impl From{ fn from(源代码:u8)->自{ 匹配原点{ 0x0=>返回值类型::k1, 0x1=>返回值类型::k2, _=>返回值类型

我有以下代码:

#[派生(PartialEq,PartialOrd)]
枚举值类型{
k1,
k2,
众所周知,
}
impl值类型{
fn值(&self)->u8{
匹配自我{
ValueType::k1=>0x0,
ValueType::k2=>0x1,
ValueType::kUnknown=>0xff,
}
}
}
ValueType的impl From{
fn from(源代码:u8)->自{
匹配原点{
0x0=>返回值类型::k1,
0x1=>返回值类型::k2,
_=>返回值类型::已知,
};
}
}
fn main(){
设a:ValueType=0x0为u8;//错误,应为枚举'ValueType',找到u8
}
我想将
u8
转换为
ValueType
。如何以生锈的方式实现它?

是自动为您实现的,作为来自的
的一个补充特性,因此您可以使用它提供的方法,下面的编译就可以了。(
Into::Into
,与
From::From
不同,它是一个方法,而不是一个关联函数。)

fn main(){
设a:ValueType=0x0u8.into();
}

您可以使用已经实现的关联from()方法:

...
#[derive(PartialEq, PartialOrd, Debug)]
...

fn main() {
    let a = ValueType::from(0x0u8);
    let b: ValueType = 0x0u8.into();
    assert_eq!(a,b);
}

有一种方法可以保证大量手工编写代码。@hellow感谢您提到num_enum。它看起来是这类东西的最佳包装,因为它提供了一个实际实现
std::convert
traits的派生宏(而不是创建不必要的新traits或关联函数)。不知何故,我在搜索crates.io时没有遇到它。