Rust语言locale库中数字开头的地区代码枚举值命名规范咨询
首先你当前使用下划线前缀的实现本身不存在语法问题,也不会带来运行时风险:Rust仅禁止标识符以数字开头,下划线开头的枚举变体完全符合语法规则,只是下划线前缀的通用约定是标记「未使用的变量/参数」,用在枚举变体上会存在轻微的语义歧义。
以下是几种更优的实现方案:
- 方案1:给数字开头的变体加统一语义前缀
放弃下划线前缀,改用和业务相关的短前缀,比如T(Territory的缩写),将数字开头的变体命名为T001、T002,既符合标识符规则,也不会和下划线的通用约定冲突,同时和其他字母开头的变体风格统一。如果追求规范性,也可以把所有变体改为地区代码官方标准的全大写写法:US、UK、JP、T001,更符合行业通用使用习惯。 - 方案2:使用语义化变体名+序列化别名
数字开头的地区代码本身都有对应明确语义,比如001代表全球、002代表非洲,你可以直接用语义作为变体名,再通过strum库的派生宏配置序列化、反序列化别名,兼顾代码可读性和标准兼容性。示例实现如下:
这种实现下,代码中可以直接调用语义化的use strum::{EnumString, Display, IntoStaticStr}; #[derive(Debug, PartialEq, Eq, EnumString, Display, IntoStaticStr)] #[non_exhaustive] #[repr(u16)] pub enum Territory { /// 全球(对应标准地区代码001) #[strum(serialize = "001", to_string = "001")] World, /// 非洲(对应标准地区代码002) #[strum(serialize = "002", to_string = "002")] Africa, US, UK, JP, KP, KR, }Territory::World,转字符串、解析字符串时会自动和标准的001代码对齐,不需要用户记忆数字代码对应的含义。 - 方案3:保留下划线前缀+补充文档
如果你希望变体名和地区代码尽可能一一对应,也可以保留当前的下划线开头写法,只需要给对应变体补充清晰的文档注释即可,这种写法在Rust生态中非常常见,没有明确的设计缺陷。
参考实现案例
目前Rust生态的成熟国际化库都有同类场景的实现,比如ICU4X的icu_locid模块中的地区枚举,对数字开头的地区代码就采用了下划线前缀的变体命名,同时也提供了语义化的别名方法,同时支持从数字、字符串两种格式解析为枚举值。
内容的提问来源于stack exchange,提问作者hardboiled65
相关产品推荐
相关产品推荐

