まとめ - セキュアロッカー
CoddyのRustジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 13/61。
チャレンジ
簡単カプセル化について学んだことをすべて組み合わせて、安全な locker システムを作りましょう!あなたの locker は秘密の code によって contents を保護します。code を知っている人だけが中身を見ることができます。
コードを整理するために、2つのファイルを作成します。
locker.rs:2つの private なフィールド、code(u32)とcontents(String)を持つLockerstruct を Define します。struct 自体は public にしますが、locker の安全性を守るため、両方のフィールドは private のままにします。次を Implement します。- initial code と contents を Takes する
newconstructor - locker の code を変更できる
set_codemethod - attempted code を Takes する
get_contentsmethod。locker の code と matches した場合は contents を返し、それ以外の場合は"Access denied"を返します
- initial code と contents を Takes する
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 coins5つの入力を受け取ります。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オンラインコンパイラ