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

[重学Rust]之结构体打印和转换

✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨

这里有:

  • 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!
  • 趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~
  • 独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!

👉 点击直达→ 盹猫猫的个人小站 👈
🌟 来逛逛吧,说不定能挖到你正在找的技术宝藏哦~

目录

⭐ 前言

⭐ 环境准备

⭐ 代码步骤

🔶 自定义打印

🔶 自定义转换

🔶 疑问解答

📖 总结


欢迎来到 盹猫(>^ω^<)的博客

本篇文章主要介绍了

[📚重学Rust📚之结构体打印和转换]
❤博主广交技术好友,喜欢文章的可以关注一下❤

⭐ 前言

        编写这个系列文章的目的是为了巩固所学的Rust知识,对Rust中庞大的依赖体系进行整理,当然,如果文章内容可以帮助到你,那当然求之不得了😁

记录结构体自定义打印和转换操作

🌹学而时习之,不亦说乎!🌹

⭐ 环境准备

         除了基础的Cargo环境之外,你还需要准备以下环境,如果你没有安装Cargo环境可以通过盹猫脚本库进行Rust环境的快速搭建工作:

[package]
name = "ref_test"
version = "0.1.0"
edition = "2024"[dependencies]

因为主要用到标准库中的依赖,所以不用添加任何其它依赖项.

⭐ 代码步骤

开始之前先声明一个结构体,这里用的是User结构体:

struct User {//姓名name: String,//年龄age: i32,
}
impl User {pub fn new(name: String, age: i32) -> User {User {name: name,age: age,}}
}

通过Impl User 可以为User实现自定义的new方法(构造函数).

🔶 自定义打印

        在Rust中除了可以使用#[derive(Debug)] 标注进行实现快捷打印之外,还可以进行自定义的打印操作(类似于Java中的toString方法),实现的代码如下:

impl Display for User {fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {f.write_str(&format!("{}{}{}", "[", self.name, "]"))}
}

需要为自定义的结构体实现Display这个Trait,通过f.write_str()方法输出需要的自定义的格式,编写测试代码:

 pub fn main(){let user: User = User::new("zhangsan",18);println!("{}", user);
}

上面代码会输出:

[zhangsan]

也就是我们自定义的输出格式,但如果打印时使用{:?} 标记输出,则会调用Debug注解内的输出,输出为:

User { name: "zhangsan", age: 18 }

🔶 自定义转换

      有时我们的输入数据不一定是标准的可转换格式(如json)格式,比如下述格式:

"zhangsan,18"

我们又希望将上面的字符串可以快速转换为我们使用的结构体,那就需要用到自定义的格式转换,需要为结构体实现From<T>这个Trait(这里的T需要根据实际需要转换的值类型选择),代码如下:

impl From<String> for User {fn from(value: String) -> Self {//进行传入值根据,的分割let mut c = value.split(",");User {//分割后的第一位数据name: c.next().unwrap().to_string(),//分割后的第二位数据,并进行异常处理age: match c.next().unwrap().parse() {Ok(t) => t,Err(_e) => 0,},}}
}

这里需要对字符串数据进行分割,并分别取第一位和第二位数据赋值为name和age并进行返回,编写测试代码:

    let c = String::from("zhangsan,18");let user: User = c.into();println!("{:?}", user);

在实现From<T> 后就可以直接对这里的c调用into()方法,将其转换为User类型的结构体了.

🚨注意:这里必须指明要转换为的结构体类型,无法自动判断需要转换为的结构体类型.

🔶 疑问解答

🤔 :如果转换结构体时,比如年龄无法转换为i32类型应该如何操作?

match c.next().unwrap().parse() {Ok(t) => t,Err(_e) => 0,}

📢: 这里使用了match进行选择,当返回值为OK时,即转换成功时返回值,当报错时我们返回个默认值0或进行其它特殊处理,这样即使传入值为"ZHANGSAN,AWD" 转换为结构体时,也不会发生报错.

🤔 :如何将结构体转换为自定义的字符串?
 

let c = format!("{}",user);

可以通过format宏函数直接将结构体转换为字符串,同样会调用Display中的方法转换.

📖 总结

        在Rust中我们可以使用实现Display Trait实现自定义的格式打印,通过From<T> Trait进行自定义数据格式的转换操作.

上面就是所有配置信息了,如果内容对你有帮助,麻烦留一个赞👍和收藏⭐支持一下!


如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链

感谢您的关注和收藏!!!!!!

http://www.dtcms.com/a/391067.html

相关文章:

  • 数据结构(陈越,何钦铭) 第十一讲 散列查找
  • 2025年JBD SCI2区TOP,基于改进蚁群算法的应急路径规划,深度解析+性能实测
  • UIKit-layer
  • 一物一码公司推荐再互动平台
  • Wireshark捕获MQTT报文
  • Docker镜像核心作战手册:镜像命令全解析+离线迁移实战+压缩共享储存,打造无缝跨环境部署!
  • Static Deinitialization Order Fiasco
  • 如何使用 Qt Creator 高效调试
  • 保障路灯用电安全!配电箱漏电检测,为城市照明筑牢防线
  • 不同版本tensorflow推理报错解决方法
  • 嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
  • 在没有随机对照的情况下如果做实验对比:双重差分法(结合虚拟变量回归)(五)
  • 材质、效率双突破:Rendercool 解决室内渲染核心痛点
  • 【ThreeJs】【材质Material】核心材质参数解析手册
  • 无人机桨叶的材质与工艺对飞行速度的影响
  • PMBOK第六版项目沟通管理总结
  • fatal: Need to specify how to reconcile divergent branches.原因及解决方案
  • 二叉树与二叉搜索树(BST):从基础到应用
  • 【一天一个Web3概念】区块链分叉(Fork)全面解析:类型、案例与影响
  • PHP低代码工作流创新,为企业数字化转型添翼
  • 低代码+AI生态:企业数字化起步阶段的“核聚变”冲击波
  • 【Linux基础知识系列:第一百三十四篇】理解Linux的进程调度策略
  • 主机windows虚拟机centos的hadoop调试mapreduce访问hdfs文件
  • 嵌入式Linux C语言程序设计
  • 【开题答辩全过程】以 基于Python的电影数据爬取及可视化分析为例,包含答辩的问题和答案
  • 推荐一些适合新手的Java项目教程
  • 探索PV操作:并发编程的核心钥匙
  • 一计算机网络基本概念-体系结构-思考题
  • Teslasuit动捕服的实际应用,系统利用电肌肉刺激为用户在VR中提供逼真的感觉和触觉
  • 【DMA】深入解析DMA控制器架构与运作原理