我应该如何根据循环 itera/tion/tor 分配此枚举?

How should I assign this enum based on the loops itera/tion/tor?

enum MealTime {
    Breakfast,
    Lunch,
    Dinner,
}

 for n in 1..3 {
        let mealc: MealTime = match n {
            1 => MealTime::Breakfast,
            2 => MealTime::Lunch,
            3 => MealTime::Dinner,
        };

起初我尝试做 for meal in MealTime {} 但发现那是行不通的,因为 Rust 不支持遍历枚举(至少在默认情况下不支持或不自己实现特征)。因此,我决定只使用一个由整数范围的标准 for 循环,只是为了意识到使用迭代器将变量与其中一种枚举类型匹配会导致错误:

错误[E0004]:非详尽模式:i32::MIN..=0_i324_i32..=i32::MAX 未涵盖。

这应该怎么做?我认为匹配 n 为 1、2 和 3 的所有 3 种情况都可行。

问题是 Rust 不知道 n 只会是 1、2 或 3 之一,它假设 n 可以是任何 i32。那么如果n == 5怎么办?如果您确定除 1、2 或 3 之外的任何值都不可能出现,您可以使用 unreachable! 宏给编译器一个提示,如下所示:

for n in 1..=3 {
    let mealc: MealTime = match n {
        1 => MealTime::Breakfast,
        2 => MealTime::Lunch,
        3 => MealTime::Dinner,
        _ => unreachable!(),
    };
}

如果 n 不是 1、2 或 3,则此程序将崩溃。顺便说一下,你必须写 1..=3 而不是 1..31..3是排除范围,1..=3是包容range

for meal in MealTime {} 的替代品可以是:

for meal in [MealTime::Breakfast, MealTime::Lunch, MealTime::Dinner] {
    // do something with meal
}

更多的解释和解决方案,参见Is there a way to iterate through the values of an enum?