Menu
CoddyTech

回顾:安全储物柜

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 13 课,共 61 课。

challenge icon

挑战

简单

让我们构建一个安全的储物柜系统,把你学过的封装知识都用起来!储物柜会用密码保护其中的物品:只有知道密码的人才能看到里面的东西。

你将创建两个文件来整理代码:

  • locker.rs:定义一个包含两个私有字段的 Locker 结构体:code(u32)和 contents(String)。结构体应为公开的,但两个字段都必须保持私有,以保护储物柜的安全性。实现以下内容:
    • 一个 new 构造函数,接收初始密码和物品内容
    • 一个 set_code 方法,用于更改储物柜的密码
    • 一个 get_contents 方法,接收尝试使用的密码。如果密码与储物柜的密码匹配,则返回物品内容;否则,返回 "Access denied"
  • main.rs:引入储物柜模块,创建一个储物柜,并尝试使用正确和错误的密码访问其中的物品,以展示它的安全功能。

get_contents 方法应返回一个 String,密码正确时返回实际物品内容,密码错误时返回拒绝访问的消息。这是一个条件获取方法,会先验证访问权限,再显示私有数据。

你的输出应遵循以下格式:

Attempt with {code}: {result}
Code changed
Attempt with {code}: {result}

例如,如果你创建一个密码为 1234、物品内容为 "Gold coins" 的储物柜,然后尝试使用密码 0000,将密码更改为 5678,再尝试使用 5678,输出将是:

Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coins

你将收到 5 个输入:初始密码、物品内容、第一次尝试使用的密码、要设置的新密码,以及第二次尝试使用的密码。

亲手试试

mod locker;

use locker::Locker;

fn main() {
    // 读取输入
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let initial_code: u32 = input.trim().parse().expect("Invalid number");

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let contents = input.trim().to_string();

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let first_attempt: u32 = input.trim().parse().expect("Invalid number");

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let new_code: u32 = input.trim().parse().expect("Invalid number");

    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let second_attempt: u32 = input.trim().parse().expect("Invalid number");

    // TODO: 使用 initial_code 和 contents 创建一个新的 Locker

    // TODO: 尝试用 first_attempt 作为密码获取 contents
    // 打印:"Attempt with {code}: {result}"

    // TODO: 将储物柜密码改为 new_code
    // 打印:"Code changed"

    // TODO: 尝试用 second_attempt 作为密码获取 contents
    // 打印:"Attempt with {code}: {result}"
}

面向对象编程中的所有课

自己练习: Rust 在线编译器