Menu
CoddyTech

可变结构体

本课属于 Coddy Rust 学习旅程的“逻辑与流程”单元。第 23 课,共 66 课。

默认情况下,Rust 中的结构体实例是不可变的,也就是说,创建后无法更改字段值。不过,和其他变量一样,你可以在声明结构体实例时添加 mut 关键字,让它变得可变。

将结构体实例声明为可变后,你可以使用点号表示法修改它的任意字段:

let mut player = Player {
    name: String::from("Alice"),
    score: 0,
};

player.score = 100; // 这样写可以,因为 player 是可变的

如果没有 mut 关键字,尝试更改字段会导致编译错误。可变性适用于整个结构体实例,你不能只让某些字段可变,同时保持其他字段不可变。

challenge icon

挑战

简单

你将收到 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:按要求的格式打印输出
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Rust 在线编译器