G.TYP.ENM.07 如需依赖 Enum 中变体的序数,则应为变体设置明确的数值

【级别】 要求

【描述】

在日常开发中,有时需要产生出有独立名称,且为连续或是有规律的数值,用来当作接口的参数数值,一般采用枚举(Enum)来实现。

Rust 语言的枚举变体的序数(ordinal)依赖于它的定义顺序。在开发过程中,很有可能需要新增变体。一般情况下,都是从尾部追加变体,但不排除有人会从中间新增变体,或者,依赖于某些库将变体自动按字典序排序,这样就有可能打乱枚举变体本来到顺序,导致程序中依赖变体序数的代码产生逻辑错误。

所以,在这种情况下,我们需要为变体设置明确的数值

【反例】

// 不符合
enum Mode {
    Mode0, // 0
    Mode1, // 1
    Mode3, // 2
    Mode2, // 3
}
 
fn main() {
    // 不符合:报错,此处 Mode::Mode3 对应值为 2 ,而不是 3
    assert_eq!(3, Mode::Mode3 as u8);
}

【正例】

// 符合
enum Mode {
    Mode0 = 0, 
    Mode1 = 1, 
    Mode3 = 3, 
    Mode2 = 2, 
}
 
fn main() {
    // 符合
    assert_eq!(3, Mode::Mode3 as u8);
}