news 2026/4/18 5:31:33

【time-rs】月份枚举实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【time-rs】月份枚举实现
// 基本定义#[repr(u8)]pubenumMonth{January=1,February=2,March=3,April=4,May=5,June=6,July=7,August=8,September=9,October=10,November=11,December=12,}

1. 枚举定义和特征

月份枚举1开始编号而不是 0,这符合日常习惯:

#[repr(u8)]// 确保以 u8 形式存储#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]pubenumMonth{January=1,// 不是 0!// ... 其他月份December=12,}

2. 核心方法实现

2.1 创建和转换方法

implMonth{/// 从数字创建月份pub(crate)constfnfrom_number(n:NonZero<u8>)->Result<Self,error::ComponentRange>{matchn.get(){1=>Ok(January),// ... 2-1112=>Ok(December),n=>Err(error::ComponentRange{/* 错误详情 */}),}}/// 获取月份天数(考虑闰年)pubconstfnlength(self,year:i32)->u8{util::days_in_month(self,year)}}

2.2 月份导航方法

implMonth{/// 获取上个月pubconstfnprevious(self)->Self{matchself{January=>December,February=>January,// ... 其他匹配}}/// 获取下个月pubconstfnnext(self)->Self{matchself{January=>February,// ... 其他匹配December=>January,}}/// 获取第 n 个下个月pubconstfnnth_next(self,n:u8)->Self{match(selfasu8-1+n%12)%12{0=>January,// ... 1-1011=>December,_=>unreachable!(),}}}

3. 特性实现

3.1 智能显示(SmartDisplay)

implSmartDisplayforMonth{typeMetadata=MonthMetadata;fnmetadata(&self,_:FormatterOptions)->Metadata<'_,Self>{matchself{January=>Metadata::new(7,self,MonthMetadata),// "January" 长度 7February=>Metadata::new(8,self,MonthMetadata),// "February" 长度 8// ... 其他月份}}fnfmt(&self,f:&mutfmt::Formatter<'_>)->fmt::Result{f.pad(matchself{January=>"January",// ... 其他月份名称})}}

3.2 标准特性实现

// 显示实现委托给 SmartDisplayimplfmt::DisplayforMonth{fnfmt(&self,f:&mutfmt::Formatter<'_>)->fmt::Result{SmartDisplay::fmt(self,f)}}// 从字符串解析implFromStrforMonth{typeErr=error::InvalidVariant;fnfrom_str(s:&str)->Result<Self,Self::Err>{matchs{"January"=>Ok(January),// ... 其他月份名称_=>Err(error::InvalidVariant),}}}

3.3 类型转换

// Month -> u8implFrom<Month>foru8{fnfrom(month:Month)->Self{monthasSelf// 安全:月份值 1-12}}// u8 -> Month(安全转换)implTryFrom<u8>forMonth{typeError=error::ComponentRange;fntry_from(value:u8)->Result<Self,Self::Error>{matchNonZero::new(value){Some(value)=>Self::from_number(value),None=>Err(/* 错误:值为 0 */),}}}

4. 设计特点总结

特点说明
类型安全使用枚举而非整数,防止无效月份值
零成本抽象使用const函数和内联优化
内存优化使用NonZero<u8>#[repr(u8)]
完整功能支持显示、解析、导航、天数计算
实用 API提供日常需要的月份操作

5. 使用示例

// 创建月份letjanuary=Month::January;letfebruary=Month::try_from(2).unwrap();// 显示月份println!("Current month: {}",january);// "January"// 计算天数(考虑闰年)println!("Days in Feb 2020: {}",Month::February.length(2020));// 29// 月份导航letnext_month=january.next();// Februaryletthree_months_later=january.nth_next(3);// April// 类型转换letmonth_num:u8=january.into();// 1letfrom_str:Month="March".parse().unwrap();// Month::March
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 23:40:51

收藏!LLM为何离不开向量数据库?小白也能懂的核心逻辑

对刚入门大模型的程序员和小白来说&#xff0c;“LLM&#xff08;大语言模型&#xff09;”和“向量数据库”经常被绑定提及。不少人会困惑&#xff1a;明明模型训练完就有了生成文本的能力&#xff0c;向量数据库到底是来“打辅助”还是“挑大梁”的&#xff1f;今天咱们用最直…

作者头像 李华
网站建设 2026/4/17 12:47:45

65、《vi、ex 和 vim 编辑器命令详解》

《vi、ex 和 vim 编辑器命令详解》 1. 命令基础 在使用 vi、ex 和 vim 编辑器时,有一些通用的命令规则和地址符号需要了解。 - 命令选项 : - ! :表示命令的变体形式,会覆盖正常行为,且必须紧跟在命令之后。 - count :命令重复执行的次数。与 vi 命令不同,在 …

作者头像 李华
网站建设 2026/4/12 20:09:47

79、Linux 操作指南:从光盘刻录到文本文件处理

Linux 操作指南:从光盘刻录到文本文件处理 1. Linux 光盘和 DVD 刻录 1.1 使用 K3b 刻录 如果你想使用 K3b 来刻录 Linux 的 CD 或 DVD,可以按照以下步骤操作: 1. 将空白 CD 或 DVD 插入 CD/DVD 驱动器(可能是组合驱动器)。如果弹出“CD/DVD 创建器”窗口,直接关闭即…

作者头像 李华
网站建设 2026/4/18 3:21:05

73、Subversion 版本控制系统使用指南

Subversion 版本控制系统使用指南 1. 引言 Subversion 是一个强大的版本控制系统,它提供了丰富的命令和功能,用于管理项目的版本和协作开发。本文将详细介绍 Subversion 的常用命令及其使用方法,以帮助开发者更好地利用该系统进行项目管理。 2. 基本命令介绍 2.1 svn re…

作者头像 李华
网站建设 2026/4/16 23:18:05

Harness获得2.4亿美元融资,专注自动化AI编码后的开发流程

AI DevOps工具公司Harness由连续创业者Jyoti Bansal于2017年创立&#xff0c;该公司预计2025年年度经常性收入将超过2.5亿美元。这家初创公司刚刚完成了2.4亿美元的E轮融资&#xff0c;融资后估值达到55亿美元。本轮融资包括由高盛领投的2亿美元主要投资&#xff0c;以及计划中…

作者头像 李华
网站建设 2026/4/18 5:26:26

实测5款企微SCRM:AI全链路运营如何让复购率提升25%?

数字经济浪潮下&#xff0c;私域已成企业增长核心&#xff0c;但很多企业仍陷“客户多转化低”“运营效率差”的困境——手动打标签耗时长、客户需求判断不准、服务响应慢。据《2025中国企业数字化私域运营白皮书》数据显示&#xff0c;国内企业私域运营渗透率已达78%&#xff…

作者头像 李华