当前位置: 首页 > news >正文

Rust_2025:阶段1:day7.1 类型转换

as

fn average(values: &[f64]) -> f64 {let total = values.iter().sum::<f64>();total / values.len() as f64
}
  1. 只有一些标准库的特定类型可以用as
  2. 可能会丢失精度,因为会截断

From

impl From<&str> for Person {fn from(s: &str) -> Person {let parts = s.split(',').collect::<Vec <&str>>();if parts.len() != 2 {return Self::default();}if parts[0] == "" {return Self::default();}if let Err(_) = parts[1].parse::<usize>(){return Self::default();}Person{ name : parts[0].to_string() , age : parts[1].parse::<usize>().unwrap()}}
}
  1. 只能返回Self,无法进行错误处理
  2. 上文如果发现非法字符只能返回默认选项

FromStr

impl FromStr for Person {type Err = ParsePersonError;fn from_str(s: &str) -> Result<Person, Self::Err> {if s.len() == 0 {return Err(ParsePersonError::Empty);}let parts = s.split(',').collect::<Vec <&str>>();if parts.len() != 2 {return Err(ParsePersonError::BadLen);}if parts[0] == "" {return Err(ParsePersonError::NoName);}if let Err(x) = parts[1].parse::<usize>(){return Err(ParsePersonError::ParseInt(x));}Ok(Person{ name : parts[0].to_string() , age : parts[1].parse::<usize>().unwrap()})}
}
  1. 特指字符串转换为其它类型
  2. 实现后可以调用parse< T >()方法,用于将字符串转换为指定类型

TryFrom

impl TryFrom<(i16, i16, i16)> for Color {type Error = IntoColorError;fn try_from(tuple: (i16, i16, i16)) -> Result<Self, Self::Error> {if tuple.0 > 255 || tuple.0 < 0 || tuple.1 > 255 || tuple.1 < 1 || tuple.2 > 255 || tuple.2 < 1{return Err(Self::Error::IntConversion);}Ok(Self{red : tuple.0 as u8, green : tuple.1 as u8, blue : tuple.2 as u8})}
}// Array implementation
impl TryFrom<[i16; 3]> for Color {type Error = IntoColorError;fn try_from(arr: [i16; 3]) -> Result<Self, Self::Error> {let mut p = 0;for x in arr.iter() {if *x > 255 || *x < 1{return Err(Self::Error::IntConversion);}p += 1;}if p != 3 {return Err(Self::Error::BadLen);}Ok(Self{red : arr[0] as u8, green : arr[1] as u8, blue : arr[2] as u8})}
}// Slice implementation
impl TryFrom<&[i16]> for Color {type Error = IntoColorError;fn try_from(slice: &[i16]) -> Result<Self, Self::Error> {if slice.len() != 3 {return Err(Self::Error::BadLen);}for x in slice.iter() {if *x > 255 || *x < 1{return Err(Self::Error::IntConversion);}}Ok(Self{red : slice[0] as u8, green : slice[1] as u8, blue : slice[2] as u8})}
}
  1. 相较于from,可以进行错误处理
  2. 相较于FromStr,可以用于其他类型
  3. 注:类型实现中的Error类型是指:在这类方法中,临时增加一个字段用于存储一个枚举值(该枚举值常用于错误处理,即经常被定义为错误枚举型)

AsRef和AsMut

fn byte_counter<T : AsRef<str>>(arg: T) -> usize {arg.as_ref().as_bytes().len()
}// Obtain the number of characters (not bytes) in the given argument.
// TODO: Add the AsRef trait appropriately as a trait bound.
fn char_counter<T : AsRef<str>>(arg: T) -> usize {arg.as_ref().chars().count()
}// Squares a number using as_mut().
// TODO: Add the appropriate trait bound.
fn num_sq<T : AsMut<u32>>(arg: &mut T) {// TODO: Implement the function body.let mut x = arg.as_mut();*x *= *x;
}
  1. 两者分别对应两个方法:
  • as_ref,根据特性约束中的泛型,返回对应泛型的不可变引用(第一个函数返回了一个&str)
  • as_mut,返回可变引用。
fn foo<T: AsRef<str> + AsRef<[u8]>>(arg: T) {let s: &str = arg.as_ref();let bytes: &[u8] = arg.as_ref();// ...可以同时使用
}
  1. 可以通过明确类型来同时使用多个AsRef
  2. 但特性约束必须要写。
http://www.dtcms.com/a/393975.html

相关文章:

  • Composer在PHP项目中的手动类自动加载策略
  • kubeasz二进制部署k8s生产环境集群
  • 浏览器缓存
  • 【PyTorch】梯度检查点 checkpoint 实现源码剖析
  • 学习嵌入式的第三十九天——ARM——汇编
  • 解决AI摘要不显示的三种方案 -AIsummary插件
  • 企业网盘,基于 .NET 技术开发,用于构建安全高效的文件云存储和云管理平台。
  • AFNetWorking
  • vscode连接ubuntu18报Gilbc2.28错
  • 华为超节点 384 集群: AI 算力的架构革新与实践
  • mescroll-uni 完全指南——Vue3 setup格式
  • 动态规划算法的欢乐密码(六):子数组系列(下)
  • StringBuilder与StringBuffer区别详解
  • 深入浅出 Scikit-learn:从入门到实战的机器学习工具包指南
  • 乡村社区服务管理系统的设计与实现-(源码+LW+可部署)
  • Spring Framework
  • 01 定位器项目笔记——知识复习回顾
  • 《Python实现图像剪辑:从基础裁剪到高级滤镜处理》
  • 【图像处理基石】工业检测中使用的图像处理算法有哪些?
  • Arbess,一款比Jenkins轻量、简洁的开源CICD工具
  • 平替PostMan,推荐一款国产开源免费的接口管理工具 - PostIn
  • 17.8 AI智能革命:ChatPPT多模态交互系统3秒生成零冲突PPT,效率提升85%
  • OceanBase数据库锁冲突排查
  • FPGA流水线除法器/加法器/乘法器_设计详解
  • 使用VBA辅助编辑出具有完美导航功能的Word长文档
  • [已更新]2025华为杯C题数学建模研赛C题研究生数学建模思路代码文章成品:围岩裂隙精准识别与三维模型重构
  • 269-基于Python的58同城租房信息数据可视化系统
  • kafka高可用数据不丢失不重复分区内有序性
  • KRaft 运维从静态到动态 Controller
  • 自动语音识别--Zipformer ASR模型