まとめ - セキュアロッカー
CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 13/61。
チャレンジ
簡単カプセル化について学んだすべてを統合して、安全なロッカーシステムを構築しましょう!このロッカーは、秘密のコードで中身を保護します。コードを知っている人だけが、中身を見ることができます。
コードを整理するために、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 coins5つの入力を受け取ります:初期コード、中身、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}"
}