news 2026/4/17 7:19:53

【time-rs】time库 ComponentRange 错误类型详解(error/component_range.rs)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【time-rs】time库 ComponentRange 错误类型详解(error/component_range.rs)

这是一个 Rust 时间库中的组件范围错误类型,用于表示时间组件(如年、月、日、时、分、秒等)值超出允许范围的情况。

1. 结构体定义

pubstructComponentRange{pub(crate)name:&'staticstr,// 组件名称pub(crate)minimum:i64,// 最小值(包含)pub(crate)maximum:i64,// 最大值(包含)pub(crate)value:i64,// 提供的值pub(crate)conditional_message:Option<&'staticstr>,// 条件性错误信息}

设计选择:使用i64作为数值类型,因为它是最窄的、能满足所有用例的整数类型,避免了泛型参数的需要。

2. 主要方法

查询方法

// 获取组件名称leterr=ComponentRange{name:"hour",minimum:0,maximum:23,value:25,conditional_message:None};assert_eq!(err.name(),"hour");// 检查是否为条件性错误letconditional_err=ComponentRange{name:"day",minimum:1,maximum:28,value:30,conditional_message:Some("in February")};assert!(conditional_err.is_conditional());

3. 特征实现

PartialEq 和 Hash

implPartialEqforComponentRange{fneq(&self,other:&Self)->bool{self.name==other.name&&self.minimum==other.minimum&&self.maximum==other.maximum&&self.value==other.value// 注意:比较时只检查是否有条件信息,不比较具体内容&&self.conditional_message.is_some()==other.conditional_message.is_some()}}implhash::HashforComponentRange{fnhash<H:hash::Hasher>(&self,state:&mutH){// 同样的逻辑:条件信息只检查是否存在}}

重要设计:比较和哈希时只检查conditional_message是否存在,不比较其内容。这是因为条件信息只是为了更好的错误提示,不影响错误的本质。

Display 特征

implfmt::DisplayforComponentRange{fnfmt(&self,f:&mutfmt::Formatter<'_>)->fmt::Result{// 基本格式:hour must be in the range 0..=23write!(f,"{} must be in the range {}..={}",self.name,self.minimum,self.maximum)?;// 如果有条件信息,追加:in FebruaryifletSome(message)=self.conditional_message{write!(f," {message}")?;}Ok(())}}

示例输出

  • hour must be in the range 0..=23
  • day must be in the range 1..=28 in February

4. 与 crate::Error 的转换

双向转换

// ComponentRange -> crate::ErrorimplFrom<ComponentRange>forcrate::Error{fnfrom(original:ComponentRange)->Self{Self::ComponentRange(original)}}// crate::Error -> ComponentRange (可能失败)implTryFrom<crate::Error>forComponentRange{typeError=error::DifferentVariant;fntry_from(err:crate::Error)->Result<Self,Self::Error>{matcherr{crate::Error::ComponentRange(err)=>Ok(err),_=>Err(error::DifferentVariant),// 如果不是 ComponentRange 变体}}}

5. Serde 集成(可选特性)

作为 Expected trait

#[cfg(feature ="serde")]implserde_core::de::ExpectedforComponentRange{fnfmt(&self,f:&mutfmt::Formatter<'_>)->fmt::Result{write!(f,"a value in the range {}..={}",self.minimum,self.maximum)}}

注意:文档指出这个实现是废弃的,将在未来的破坏性更新中移除。

转换为反序列化错误

#[cfg(feature ="serde")]implComponentRange{pub(crate)fninto_de_error<E:serde_core::de::Error>(self)->E{E::invalid_value(serde_core::de::Unexpected::Signed(self.value),&self)}}

6. Error 特征实现

implcore::error::ErrorforComponentRange{}

这使得ComponentRange可以作为标准错误类型使用,可以向上传播。

7. 使用场景示例

创建时间时验证组件

fncreate_time(hour:u8,minute:u8,second:u8)->Result<Time,ComponentRange>{ifhour>23{returnErr(ComponentRange{name:"hour",minimum:0,maximum:23,value:hourasi64,conditional_message:None,});}// ... 其他验证Ok(Time::from_hms(hour,minute,second)?)}

条件性范围错误

fnvalidate_day(month:Month,day:u8)->Result<(),ComponentRange>{letmax_days=days_in_month(month);ifday>max_days{returnErr(ComponentRange{name:"day",minimum:1,maximum:max_daysasi64,value:dayasi64,conditional_message:Some(format!("in {}",month.name()).leak()),});}Ok(())}

8. 设计亮点

  1. 明确的错误信息:包含组件名、范围、实际值
  2. 条件性范围支持:处理像"2月的天数"这样的条件限制
  3. 高效的内存使用:使用静态字符串引用,避免分配
  4. 完整的错误集成:支持标准库的 Error trait
  5. 序列化友好:可选支持 Serde 集成
  6. 类型安全:从crate::Error转换时需要显式处理

9. 典型错误流

matchTime::from_hms(25,0,0){Ok(time)=>{/* 使用时间 */}Err(ComponentRange{name:"hour",minimum,maximum,value,..})=>{println!("小时值 {} 超出范围 {}..{}",value,minimum,maximum);}Err(other_error)=>{/* 处理其他错误 */}}

这个错误类型是时间库中验证逻辑的核心部分,确保所有时间组件都在有效范围内,并提供清晰的错误信息以便调试。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 7:19:53

Qt定时执行:槽函数并非必须

在Qt C中&#xff0c;定周期执行一个函数时&#xff0c;链接的函数不一定必须是槽函数&#xff0c;但具体取决于实现方式。以下是详细分析&#xff1a; 1. 使用QTimer 信号-槽机制&#xff08;需要槽函数&#xff09; 原理&#xff1a;QTimer的timeout()信号连接到目标对象的…

作者头像 李华
网站建设 2026/4/15 22:10:47

基于单片机的多功能LCD音乐播放器设计

基于单片机的多功能LCD音乐播放器设计概述 点击下载设计资料&#xff1a;https://download.csdn.net/download/m0_51061483/92081531 1.1 设计背景与研究意义 随着嵌入式系统技术和数字多媒体技术的不断发展&#xff0c;基于单片机的音频播放设备在教学实验、电子设计实践以及…

作者头像 李华
网站建设 2026/4/15 16:45:22

粒子群算法在风光储微电网优化调度中的应用:经济目标下的电源侧与负荷侧运行策略优化

基于粒子群算法的考虑需求侧响应的风光储微电网优化调度 考虑电源侧与负荷侧运行成本&#xff0c;以经济运行为目标函数&#xff0c;风电、光伏、储能出力、上级电网购电记忆可削减负荷为优化变量&#xff0c;并采用粒子群算法进行求解。1. 系统概述 本项目实现了一个基于多目标…

作者头像 李华
网站建设 2026/4/15 18:45:06

DAY11@浙大疏锦行

笔记&#xff1a;参数优化步骤&#xff1a;1.在调参前&#xff0c;先建立基线模型&#xff1a;- 使用**默认参数**训练模型- 记录性能指标作为**对比基准**- 后续调参效果以此为参照2.对参数进行定义1️⃣ 网格搜索 (GridSearchCV)- 需要定义参数的**固定列表**&#xff08;par…

作者头像 李华
网站建设 2026/4/16 12:37:50

六自由度机械臂抓取动作仿真:两套易懂代码解析

六自由度机械臂抓取动作仿真-8 两套关于抓取动作的代码&#xff0c;包括抓取动画、关节角、角速度、角加速度的变化仿真、以及抓取轨迹图 简单易懂好上手&#xff5e;在六自由度机械臂抓取动作仿真的领域中&#xff0c;为大家分享两套超实用的代码&#xff0c;助力快速上手相关…

作者头像 李华
网站建设 2026/4/13 9:32:41

货运 app 运输管理系统框架搭建

一、货运搬家系统&#xff1a;让货运搬家更高效、更便捷在当今快节奏的生活和商业环境中&#xff0c;货运搬家是人们和企业经常面临的需求。无论是个人搬家、企业搬迁&#xff0c;还是货物运输&#xff0c;都需要一个高效、便捷的解决方案。而货运搬家系统的出现&#xff0c;正…

作者头像 李华