Enums 什么';我能用字符来区分枚举的最接近的方法是什么?

Enums 什么';我能用字符来区分枚举的最接近的方法是什么?,enums,rust,Enums,Rust,我已经把这个问题写了很多次了,并且最终意识到我最大的问题是我不知道如何表示这些数据,这使得我很难对代码的其余部分进行推理 数据在Python中的表示方式: class LSP(): C_掩模图={ “A”:“Ch A”, “B”:“Ch B”, “C”:“Ch C”, “D”:“Ch D”, “T”:“Tmpr”, “Y”:“Batt”, “L”:“Acc” } ADC_CHANS=( “中国”, “Ch B”, “Ch C”, “chd”, “Tmpr”, “巴特” ) ADC_专业=( “中

我已经把这个问题写了很多次了,并且最终意识到我最大的问题是我不知道如何表示这些数据,这使得我很难对代码的其余部分进行推理

数据在Python中的表示方式:

class LSP():
C_掩模图={
“A”:“Ch A”,
“B”:“Ch B”,
“C”:“Ch C”,
“D”:“Ch D”,
“T”:“Tmpr”,
“Y”:“Batt”,
“L”:“Acc”
}
ADC_CHANS=(
“中国”,
“Ch B”,
“Ch C”,
“chd”,
“Tmpr”,
“巴特”
)
ADC_专业=(
“中国”,
“Ch B”,
“Ch C”,
)
我想象中的锈蚀代码(我知道名称需要更新,但为了清晰起见,此处相同):


我已经考虑过制作
C\u MASK\u MAP
a
HashMap复制
&'static str
(即仅复制参考)是免费的。字符串的深层副本将是克隆,并将被键入为
字符串

如果
&'static str
对您来说太冗长,您可以始终定义一个类型别名

type Str = &'static str;

HashMap您的字符串是哨兵值;这是Python中的一种常见模式,但不是Rust中应该做的事情:枚举就是这样的事情:在类型系统中对合法值进行编码

你可能会得到这样的结果:

#[derive(Clone, Copy)]
#[repr(u8)]
pub enum Mask {
    ChA = b'A',
    ChB = b'B',
    ChC = b'C',
    ChD = b'D',
    Tmpr = b'T',
    Batt = b'Y',
    Acc  = b'L',
}

// e.g. Mask::ChA.into() == 'A'
impl Into<char> for Mask {
    fn into(self) -> char {
        self as u8 as char
    }
}

impl Mask {
    // e.g. Mask::from('A') == Ok(Mask::ChA)
    pub fn from(c: char) -> Result<Mask, ()> {
        match c {
            'A' => Ok(Mask::ChA),
            'B' => Ok(Mask::ChB),
            'C' => Ok(Mask::ChC),
            'D' => Ok(Mask::ChD),
            'T' => Ok(Mask::Tmpr),
            'Y' => Ok(Mask::Batt),
            'L' => Ok(Mask::Acc),
            _ => Err(()),
        }
    }

    // e.g. Mask::ChA.is_chan() == true
    pub fn is_chan(&self) -> bool {
        match *self {
            Mask::ChA | Mask::ChB | Mask::ChC | Mask::ChD | Mask::Tmpr | Mask::Batt => true,
            Mask::Acc => false,
        }
    }

    // e.g. Mask::ChD.is_major() == false
    pub fn is_major(&self) -> bool {
        match *self {
            Mask::ChA | Mask::ChB | Mask::ChC => true,
            Mask::ChD | Mask::Tmpr | Mask::Batt | Mask::Acc => false,
        }
    }
}
我怀疑
is_chan
等可能比
ADC_CHANS
等更合适,但如果您确实需要它们,它们工作得很好(您也可以这样做
[Mask;6]
,但如果您需要添加新元素,它会更改类型,如果公开,则会导致API兼容性中断):

#[derive(Clone, Copy)]
#[repr(u8)]
pub enum Mask {
    ChA = b'A',
    ChB = b'B',
    ChC = b'C',
    ChD = b'D',
    Tmpr = b'T',
    Batt = b'Y',
    Acc  = b'L',
}

// e.g. Mask::ChA.into() == 'A'
impl Into<char> for Mask {
    fn into(self) -> char {
        self as u8 as char
    }
}

impl Mask {
    // e.g. Mask::from('A') == Ok(Mask::ChA)
    pub fn from(c: char) -> Result<Mask, ()> {
        match c {
            'A' => Ok(Mask::ChA),
            'B' => Ok(Mask::ChB),
            'C' => Ok(Mask::ChC),
            'D' => Ok(Mask::ChD),
            'T' => Ok(Mask::Tmpr),
            'Y' => Ok(Mask::Batt),
            'L' => Ok(Mask::Acc),
            _ => Err(()),
        }
    }

    // e.g. Mask::ChA.is_chan() == true
    pub fn is_chan(&self) -> bool {
        match *self {
            Mask::ChA | Mask::ChB | Mask::ChC | Mask::ChD | Mask::Tmpr | Mask::Batt => true,
            Mask::Acc => false,
        }
    }

    // e.g. Mask::ChD.is_major() == false
    pub fn is_major(&self) -> bool {
        match *self {
            Mask::ChA | Mask::ChB | Mask::ChC => true,
            Mask::ChD | Mask::Tmpr | Mask::Batt | Mask::Acc => false,
        }
    }
}
impl FromStr for Mask {
    type Err = ();

    fn from_str(s: &str) -> Result<Mask, ()> {
        match s {
            "A" => Ok(Mask::ChA),
            "B" => Ok(Mask::ChB),
            "C" => Ok(Mask::ChC),
            "D" => Ok(Mask::ChD),
            "T" => Ok(Mask::Tmpr),
            "Y" => Ok(Mask::Batt),
            "L" => Ok(Mask::Acc),
            _ => Err(()),
        }
    }
}
pub static ADC_CHANS: &'static [Mask] = &[
    Mask::ChA,
    Mask::ChB,
    Mask::ChC,
    Mask::ChD,
    Mask::Tmpr,
    Mask::Batt,
];

pub static ADC_MAJORS: &'static [Mask] = &[
    Mask::ChA,
    Mask::ChB,
    Mask::ChC,
];