09-结构体例子
2022/4/29 23:18:51
本文主要是介绍09-结构体例子,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
结构体例子
计算长方形面积
fn main() { let width1 = 30; let height1 = 50; println!( "The area of the rectangle is {} square pixels.", area(width1, height1) ); } fn area(width: u32, height: u32) -> u32 { width * height //没有加分号,是表达式,可以返回值 }
但是作为长方形的长和宽却没有关联在一起
使用元组重构
fn main() { let rect1 = (30, 50); println!( "The area of the rectangle is {} square pixels.", area(rect1) ); } fn area(dimensions: (u32, u32)) -> u32 { //函数参数变为元组 dimensions.0 * dimensions.1 }
将长和宽通过元组组合到了一起,产生了关联
但是可读性变差了,不能知道元组中哪个元素是长,哪个元素是宽
使用结构体重构
struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!( "The area of the rectangle is {} square pixels.", area(&rect1) ); } fn area(rectangle: &Rectangle) -> u32 { //函数参数为对Rectangle这个不可变结构体的借用 rectangle.width * rectangle.height //即借用结构体而不是获取它的所有权 } //使main函数可以保持对rect1的所有权,可以继续使用它
使用结构体使程序更加清晰易懂
但是不能通过println!
宏直接打印结构体,{}默认告诉println!
宏使用 std::fmt::Display格式化方法,单因为打印结构体的格式时不明确,要打印逗号吗?大括号呢?结构体并没有提供一个 Display
实现
println!("rect1 is {}", rect1);
是不能运行的
通过派生 trait 增加实用功能
但是可以使用{:?}
或 {:#?}
指示println!
使用 Debug
的输出格式(std::fmt::Display格式化方法)
Debug
是一个 trait,它允许以一种对开发者有帮助的方式打印结构体,以便调试代码时能看到它的值。
但是只在println!
中使用Debug
是不够的,还要在结构体定义前加上外部属性 #[derive(Debug)]
,让结构体显式选择Debug
的功能
#[derive(Debug)] struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50, }; println!("rect1 is {:?}", rect1); /* 输出为 rect1 is Rectangle { width: 30, height: 50 } */ /* println!("rect1 is {:#?}", rect1); 输出为 (变得更加美观 rect1 is Rectangle { width: 30, height: 50, } */ }
还可以使用 dbg!
宏实现 Debug
格式打印数值
dbg!
宏接收一个表达式的所有权,打印出代码中调用 dbg!
宏时所在的文件和行号,以及该表达式的结果值,并返回该值的所有权
调用 dbg!
宏会打印到标准错误控制台流(stderr
),而println!
会打印到标准输出控制台流(stdout
)
#[derive(Debug)] struct Rectangle { width: u32, height: u32, } fn main() { let scale = 2; let rect1 = Rectangle { width: dbg!(30 * scale), height: 50, }; dbg!(&rect1); }
输出为
30 * scale = 60 &rect1 = Rectangle { width: 60, height: 50, }
这篇关于09-结构体例子的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01后台管理开发学习:新手入门指南
- 2024-11-01后台管理系统开发学习:新手入门教程
- 2024-11-01后台开发学习:从入门到实践的简单教程
- 2024-11-01后台综合解决方案学习:从入门到初级实战教程
- 2024-11-01接口模块封装学习入门教程
- 2024-11-01请求动作封装学习:新手入门教程
- 2024-11-01登录鉴权入门:新手必读指南
- 2024-11-01动态面包屑入门:轻松掌握导航设计技巧
- 2024-11-01动态权限入门:新手必读指南
- 2024-11-01动态主题处理入门:新手必读指南