[重学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进行自定义数据格式的转换操作.
上面就是所有配置信息了,如果内容对你有帮助,麻烦留一个赞👍和收藏⭐支持一下!
如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链
感谢您的关注和收藏!!!!!!