< 返回版块

cqustlym 发表于 2025-06-20 15:13

Tags:Match

enum Tingpai {
    Ting1,
    Ting2,
}

impl Tingpai {
    fn random() -> Tingpai {
        let mut rng = rand::rng();
        let random_num: u8 = Rng::random_range(&mut rng, 1..3);
        match random_num {
            1 => Tingpai::Ting1,
            2 => Tingpai::Ting2,
        }
    }
}

请问这段代码中为什么错误显示是没有覆盖所有的match选项?random_num生成的值不是只有1和2吗?

评论区

写评论
asuper 2025-06-23 09:42

问题上面两位已经解答了,我说个题外话,看起来你是想用整数转换成对应的枚举值,如果枚举多的话,建议看看下面的方式: 枚举和整数 - Rust语言圣经

我自己在用的是另一种形式,可以整数-枚举互转,还可以指定一个字符串值,做字符串-枚举的互转


macro_rules! def_msg_code {
    ($(#[$meta:meta])* $vis:vis enum $name:ident {
        $($(#[$vmeta:meta])* $vname:ident = ($val:literal, $desc:literal), )*
    }) => {
        $(#[$meta])*
        $vis enum $name {
            $($(#[$vmeta])* $vname = $val,)*
        }

        impl $name {
            /// 获取枚举的u32数值
            pub fn get_code(&self) -> u32 {
                match &self {
                    $($name::$vname => $val,)*
                }
            }

            /// 从枚举的整数值,解析对应的枚举值
            pub fn from_code(code: u32) -> Result<Self, &'static str> {
                match code {
                    $($val => {
                        Ok(Self::$vname)
                    } )*
                    _ => Err("Message code invalid"),
                }
            }

            /// 获取该枚举值的文字描述
            pub fn get_desc(&self) -> &'static str {
                match &self {
                    $($name::$vname => $desc,)*
                }
            }
        }

        impl std::str::FromStr for $name {
            type Err = &'static str;
            fn from_str(s: &str) -> Result<Self, Self::Err> {
                match s {
                    $($desc => {
                        Ok(Self::$vname)
                    } )*
                    _ => Err("Message description invalid"),
                }
            }
        }
    }
}

def_msg_code! {
    #[derive(Clone, Copy)]
    pub enum CmdCode {
        Test = (3000, "test"),
        Tuning = (3006, "tuning-params"),
        Exit = (3100, "exit"),
    }
}

xiaoyaou 2025-06-20 17:08

编译器推断是基于类型系统的,在没有特殊“开后门”的情况下,编译器眼里u8就是0~255,random_num类型就是u8,是无法靠类型系统以外的信息限制枚举范围的,那些是优化器的事,不属于语法/语义范畴。你可以用unreachable!宏来声明该分支应当不可达


match randon_num {
    1 => ...
    2 => ...
    _ => unreachable!()
}

miaomiao1992 2025-06-20 15:25

u8是动态生成的,编译器无法知道只能是1,2。

你可以加一个_=>panic!(xxxx)

1 共 3 条评论, 1 页