将结构体用作函数参数
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 24 课,共 66 课。
现在你已经知道如何创建和修改结构体了,接下来我们来看看如何在函数中使用它们。和 Rust 中的其他数据类型一样,你可以将结构体实例传递给函数,也可以让函数返回结构体实例。
要将结构体传递给函数,只需在函数定义中将它作为参数:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}这个函数接受一个 Rectangle 结构体作为参数,并返回一个 i32。在函数内部,你可以像在其他地方一样使用点号表示法访问结构体的字段。
你还可以通过将结构体类型指定为返回类型,让函数返回结构体:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}将结构体与函数配合使用,可以让代码更有条理,也更易于理解。你可以把相关数据组合在一起,作为一个定义明确的整体传递,而不必分别传递多个参数。
挑战
简单你会收到 4 个输入:矩形的宽(整数)、矩形的高(整数)、正方形的边长(整数)和一个选择数字(1 或 2)。定义一个包含两个字段的 Rectangle 结构体:width: i32 和 height: i32。创建两个函数:一个接收 Rectangle 并计算它的面积,另一个接收边长并返回一个表示正方形的 Rectangle。根据输入的选择,计算并打印相应的面积。
要求:
- 定义一个包含以下字段的
Rectangle结构体:width: i32和height: i32 - 创建一个名为
calculate_area的函数,该函数接收一个Rectangle作为参数,并返回一个i32(面积) - 创建一个名为
create_square的函数,该函数接收一个i32(边长)作为参数,并返回一个宽和高相等的Rectangle - 读取第一个输入,并将其转换为
i32,作为矩形的宽 - 读取第二个输入,并将其转换为
i32,作为矩形的高 - 使用这些尺寸创建一个
Rectangle实例 - 读取第三个输入,并将其转换为
i32,作为正方形的边长 - 读取第四个输入,并将其转换为
i32,作为选择数字(1 或 2) - 如果选择为 1:计算并打印矩形的面积
- 如果选择为 2:使用
create_square创建一个正方形,然后计算并打印它的面积
输入:
- 第一行:矩形的宽,以整数表示(例如,
8) - 第二行:矩形的高,以整数表示(例如,
5) - 第三行:正方形的边长,以整数表示(例如,
6) - 第四行:选择数字,以整数表示,只能是 1 或 2(例如,
1)
输出:
- 如果选择为 1:
Rectangle area: [area] - 如果选择为 2:
Square area: [area]
亲手试试
use std::io;
// TODO: 在这里定义 Rectangle 结构体
// TODO: 在这里定义 calculate_area 函数
// TODO: 在这里定义 create_square 函数
fn main() {
// 读取矩形的宽度
let mut width_input = String::new();
io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: i32 = width_input.trim().parse().expect("Invalid input");
// 读取矩形的高度
let mut height_input = String::new();
io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: i32 = height_input.trim().parse().expect("Invalid input");
// 读取正方形的边长
let mut side_input = String::new();
io::stdin().read_line(&mut side_input).expect("Failed to read line");
let side: i32 = side_input.trim().parse().expect("Invalid input");
// 读取选项
let mut choice_input = String::new();
io::stdin().read_line(&mut choice_input).expect("Failed to read line");
let choice: i32 = choice_input.trim().parse().expect("Invalid input");
// TODO: 在下方编写代码
// 创建一个 Rectangle 实例,检查选项,并计算相应的面积
// 根据选项输出结果
// 使用:println!("Rectangle area: {}", area); 或 println!("Square area: {}", area);
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器