Menu
Coddy logo textTech

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

CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 13/61。

challenge icon

チャレンジ

簡単

カプセル化について学んだことをすべて組み合わせて、安全な locker システムを作りましょう!あなたの locker は秘密の code によって contents を保護します。code を知っている人だけが中身を見ることができます。

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

  • locker.rs:2つの private なフィールド、code(u32)と contents(String)を持つ Locker struct を Define します。struct 自体は public にしますが、locker の安全性を守るため、両方のフィールドは private のままにします。次を Implement します。
    • initial code と contents を Takes する new constructor
    • locker の code を変更できる set_code method
    • attempted code を Takes する get_contents method。locker の code と matches した場合は contents を返し、それ以外の場合は "Access denied" を返します
  • main.rs:locker module を取り込み、locker を作成し、正しい code と間違った code の両方で contents への Access を試みて、その安全機能を確認します。

get_contents method は String を返す必要があります。code が正しい場合は実際の contents を、間違っている場合は denied メッセージを返します。これは、private データを明らかにする前に Access を検証する conditional getter です。

出力は次の正確な形式にしてください。

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

たとえば、code 1234 と contents "Gold coins" で locker を作成し、code 0000 を試した後、code を 5678 に Change して 5678 を試すと、出力は次のようになります。

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

5つの入力を受け取ります。initial code、contents、first attempt code、設定する new code、そして second attempt code です。

自分で試してみよう

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 に変更する
    // Print: "Code changed"

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

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rustオンラインコンパイラ