可变结构体
本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 23 课,共 66 课。
默认情况下,Rust 中的结构体实例是不可变的,也就是说,创建后无法更改字段值。不过,和其他变量一样,你可以在声明结构体实例时添加 mut 关键字,让它变得可变。
将结构体实例声明为可变后,你可以使用点号表示法修改它的任意字段:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // 这样写可以,因为 player 是可变的如果没有 mut 关键字,尝试更改字段会导致编译错误。可变性适用于整个结构体实例,你不能只让某些字段可变,同时保持其他字段不可变。
挑战
简单你将收到 4 个输入:玩家姓名、初始分数(整数)、要添加的奖励分数(整数)和最终分数调整值(整数)。定义一个 Player 结构体,其中包含两个字段:类型为 String 的 name 和类型为 i32 的 score。创建这个结构体的可变实例,然后使用输入值多次修改分数字段。
要求:
- 定义一个
Player结构体,包含以下字段:name: String和score: i32 - 将第一个输入读取为玩家姓名
- 读取第二个输入,并将其转换为
i32,作为初始分数 - 使用这些值创建
Player结构体的可变实例 - 读取第三个输入,并将其转换为
i32,作为奖励分数 - 使用点表示法将奖励分数加到玩家当前分数上
- 读取第四个输入,并将其转换为
i32,作为最终调整值 - 将最终调整值加到玩家当前分数上
- 按照下方显示的确切格式打印玩家信息
输入:
- 第一行:玩家姓名(例如,
Alice) - 第二行:初始分数,整数(例如,
50) - 第三行:奖励分数,整数(例如,
30) - 第四行:最终调整值,整数(例如,
20)
输出:
- 第一行:
Player: [name] - 第二行:
Final Score: [score]
亲手试试
use std::io;
// TODO:在这里定义 Player 结构体,包含 name 和 score 字段
fn main() {
// 读取玩家姓名
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// 读取初始分数
let mut initial_score = String::new();
io::stdin().read_line(&mut initial_score).expect("Failed to read line");
let initial_score: i32 = initial_score.trim().parse().expect("Invalid number");
// 读取奖励分数
let mut bonus = String::new();
io::stdin().read_line(&mut bonus).expect("Failed to read line");
let bonus: i32 = bonus.trim().parse().expect("Invalid number");
// 读取最终调整值
let mut adjustment = String::new();
io::stdin().read_line(&mut adjustment).expect("Failed to read line");
let adjustment: i32 = adjustment.trim().parse().expect("Invalid number");
// TODO:创建一个可变的 Player 实例
// TODO:将奖励分数加到玩家的分数上
// TODO:将最终调整值加到玩家的分数上
// TODO:按要求的格式打印输出
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Rust 在线编译器