Menu
Coddy logo textTech

まとめ - セキュアロッカー

CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 13/61。

challenge icon

チャレンジ

簡単

カプセル化について学んだすべてを統合して、安全なロッカーシステムを構築しましょう!このロッカーは、秘密のコードで中身を保護します。コードを知っている人だけが、中身を見ることができます。

コードを整理するために、2つのファイルを作成します:

  • locker.rs: 2つのプライベートフィールド、code (u32) と contents (String) を持つ Locker 構造体を定義します。構造体はパブリックにする必要がありますが、ロッカーのセキュリティを保護するために、両方のフィールドはプライベートのままにする必要があります。以下を実装してください:
    • 初期コードと中身を受け取る 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つの入力を受け取ります:初期コード、中身、1回目の試行コード、新しく設定するコード、そして2回目の試行コードです。

自分で試してみよう

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 のコードで中身の取得を試みる
    // 出力: "Attempt with {code}: {result}"

    // TODO: ロッカーのコードを new_code に変更する
    // 出力: "Code changed"

    // TODO: second_attempt のコードで中身の取得を試みる
    // 出力: "Attempt with {code}: {result}"
}

Object Oriented Programmingのすべてのレッスン