计算长方形面积
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);
是不能运行的
但是可以使用{:?}
或 {:#?}
指示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, }