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); }