回顾:安全储物柜
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 13 课,共 61 课。
挑战
简单让我们构建一个安全的储物柜系统,把你学过的封装知识都用起来!储物柜会用密码保护其中的物品:只有知道密码的人才能看到里面的东西。
你将创建两个文件来整理代码:
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 在线编译器