An Example Program Using Structs
为了理解何时需要使用结构体,让我们编写一个计算矩形面积的程序。我们将通过使用单个变量开始,然后重构这个程序,直到用结构体替代它。
让我们用cargo创建一个新的项目叫做rectangles
的二进制程序,它获取以像素为单位的矩形的宽度和高度,并计算出矩形的面积。Listing 5-8 展示一个简短的程序:
1 |
|
我们可以把dbg!
放在表达式放在30 * scale
周围,以为你dbg!
返回表达式的值的所有权,所以width字段将获得相同的值,就像我们在这里没有dbg!
调用一样。我们不希望dbg!拥有rect1的所有权,所以我们在下一次调用dbg!时传递一个引用。下面是这个例子的输出结果:
1 | $ cargo run |
我们可以看到第一条输出来自src/main.rs第10行,我们正在调用表达式30 * scale
,其结果值是60(为整数实现的Debug格式化是只打印它们的值)。在src/main.rs第14行的dbg!调用输出&rect1的值,即Rectangle
类型。dbg!
宏确实很有用。
除了Debug
trait,Rust还为我们提供了很多通过derive属性来使用的trait,它们可以为我们的自定义类型增加实用的行为。这些trait和行为被列举在附录C(Appendix C)。第十章会介绍如何通过自定义行为来实现这些trait,同时还有如何创建你自己的trait。除了derive之外,还有很多属性;更多信息见”Rust Reference”的Attribute部分。
我们的area
函数是非常特殊的,它只计算长方形的面积。如果这个行为与Rectangle
结构体再结合得更紧密一些就更好了,因为它不能用于其他类型。现在让我们看看如何继续重构这些代码,来将area
函数协调进Rectangle
类型定义的area
方法中。