Ôn tập: tủ khóa an toàn
Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 13 trên 61.
Thử thách
DễHãy xây dựng một hệ thống tủ khóa an toàn, kết hợp mọi điều bạn đã học về tính đóng gói! Tủ khóa sẽ bảo vệ đồ bên trong bằng một mã bí mật: chỉ người biết mã mới có thể xem bên trong.
Bạn sẽ tạo hai tệp để sắp xếp code:
locker.rs: Định nghĩa một structLockercó hai trường riêng tư:code(u32) vàcontents(String). Struct này cần là công khai, nhưng cả hai trường phải giữ riêng tư để bảo vệ tính an toàn của tủ khóa. Hãy triển khai:- Một hàm khởi tạo
newnhận mã ban đầu và đồ bên trong - Một phương thức
set_codecho phép thay đổi mã của tủ khóa - Một phương thức
get_contentsnhận mã được thử. Nếu mã đó khớp với mã của tủ khóa, hãy trả về đồ bên trong; nếu không, hãy trả về"Access denied"
- Một hàm khởi tạo
main.rs: Đưa module tủ khóa vào, tạo một tủ khóa và minh họa các tính năng bảo mật bằng cách thử truy cập đồ bên trong với cả mã đúng và mã sai.
Phương thức get_contents cần trả về một String, có thể là đồ bên trong thực tế khi mã đúng hoặc thông báo từ chối khi mã sai. Đây là getter có điều kiện, xác thực quyền truy cập trước khi tiết lộ dữ liệu riêng tư.
Đầu ra của bạn cần theo đúng định dạng sau:
Attempt with {code}: {result}
Code changed
Attempt with {code}: {result}Ví dụ, nếu bạn tạo một tủ khóa với mã 1234 và đồ bên trong là "Gold coins", sau đó thử mã 0000, đổi mã thành 5678 rồi thử 5678, đầu ra sẽ là:
Attempt with 0000: Access denied
Code changed
Attempt with 5678: Gold coinsBạn sẽ nhận năm đầu vào: mã ban đầu, đồ bên trong, mã thử lần đầu, mã mới cần đặt và mã thử lần thứ hai.
Tự làm thử
mod locker;
use locker::Locker;
fn main() {
// Đọc các đầu vào
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: Tạo Locker mới với initial_code và contents
// TODO: Thử lấy contents bằng code first_attempt
// In ra: "Attempt with {code}: {result}"
// TODO: Đổi code của Locker thành new_code
// In ra: "Code changed"
// TODO: Thử lấy contents bằng code second_attempt
// In ra: "Attempt with {code}: {result}"
}
Tất cả bài học trong Lập trình hướng đối tượng
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online