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,height,width,例子,u32,println,rect1,Rectangle,结构 来源: https://www.cnblogs.com/ragworm/p/16208121.html