0%

Ch 05.02:An Example Program Using Structs

An Example Program Using Structs

为了理解何时需要使用结构体,让我们编写一个计算矩形面积的程序。我们将通过使用单个变量开始,然后重构这个程序,直到用结构体替代它。

让我们用cargo创建一个新的项目叫做rectangles的二进制程序,它获取以像素为单位的矩形的宽度和高度,并计算出矩形的面积。Listing 5-8 展示一个简短的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}

fn main() {
let scale = 2;
let rect1 = Rectangle {
width: dbg!(30 * scale),
height: 50,
};

dbg!(&rect1);
}

我们可以把dbg!放在表达式放在30 * scale周围,以为你dbg!返回表达式的值的所有权,所以width字段将获得相同的值,就像我们在这里没有dbg!调用一样。我们不希望dbg!拥有rect1的所有权,所以我们在下一次调用dbg!时传递一个引用。下面是这个例子的输出结果:

1
2
3
4
5
6
7
8
9
$ cargo run
Compiling rectangles v0.1.0 (file:///projects/rectangles)
Finished dev [unoptimized + debuginfo] target(s) in 0.61s
Running `target/debug/rectangles`
[src/main.rs:10] 30 * scale = 60
[src/main.rs:14] &rect1 = Rectangle {
width: 60,
height: 50,
}

我们可以看到第一条输出来自src/main.rs第10行,我们正在调用表达式30 * scale,其结果值是60(为整数实现的Debug格式化是只打印它们的值)。在src/main.rs第14行的dbg!调用输出&rect1的值,即Rectangle类型。dbg!宏确实很有用。

除了Debugtrait,Rust还为我们提供了很多通过derive属性来使用的trait,它们可以为我们的自定义类型增加实用的行为。这些trait和行为被列举在附录C(Appendix C)。第十章会介绍如何通过自定义行为来实现这些trait,同时还有如何创建你自己的trait。除了derive之外,还有很多属性;更多信息见”Rust Reference”的Attribute部分。

我们的area函数是非常特殊的,它只计算长方形的面积。如果这个行为与Rectangle结构体再结合得更紧密一些就更好了,因为它不能用于其他类型。现在让我们看看如何继续重构这些代码,来将area函数协调进Rectangle类型定义的area方法中。

宇宙山河浪漫,赞赏动力无限

Welcome to my other publishing channels