Menu
CoddyTech

Ô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.

challenge icon

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 struct Locker có 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 new nhận mã ban đầu và đồ bên trong
    • Một phương thức set_code cho phép thay đổi mã của tủ khóa
    • Một phương thức get_contents nhậ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"
  • 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 coins

Bạ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

Tự luyện tập: Trình biên dịch Rust online