まとめ - スマートポインタのモック
CoddyのRustジャーニー「Object Oriented Programming」セクションの一部 — レッスン 58/61。
チャレンジ
簡単Rustの実際のスマートポインタが内部でどのように動作するかをデモンストレーションする、SmartBoxという名前のスマートポインタのモックを作成しましょう!このラッパーはジェネリックであり、内部の値へのアクセスを提供し、クリーンアップされる際に自動的に通知を行うようにします。
コードは2つのファイルに分けて構成します:
smart_box.rs: 型Tの単一のフィールドvalueを持つ、パブリックなジェネリック構造体SmartBox<T>を定義します。SmartBoxを作成し、作成メッセージを表示するnew関連関数を実装してください。内部の値への参照を返すgetメソッドを追加します。最後に、SmartBoxがスコープを抜けるときにクリーンアップメッセージを表示するようにDropトレイトを実装してください。main.rs: smart_boxモジュールを取り込み、2つの異なる型でSmartBoxをデモンストレーションします。数値(提供された入力から)を保持するSmartBox<i32>と、テキスト(提供された入力から)を保持するSmartBox<String>を作成します。getメソッドを使用して値を表示してください。Dropメッセージは、mainの最後でボックスがスコープを抜けるときに自動的に表示されます。
SmartBoxが作成されるとき、次のように表示する必要があります:
SmartBox created値にアクセスするときは、次の形式で表示してください:
Value: {value}SmartBoxがドロップされるとき、次のように表示する必要があります:
SmartBox dropped例えば、入力が42とHelloの場合:
SmartBox created
SmartBox created
Value: 42
Value: Hello
SmartBox dropped
SmartBox droppedmainが終了するときに、両方のボックスが最初に作成され、次にそれらの値にアクセスされ、最後に両方が逆の順序(最後に作成されたものが最初にドロップされる)でドロップされることに注目してください。
2つの入力を受け取ります:整数値(i32としてパース)と文字列値です。
自分で試してみよう
mod smart_box;
use smart_box::SmartBox;
fn main() {
// 入力を読み込む
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let number: i32 = input1.trim().parse().expect("Failed to parse number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let text = input2.trim().to_string();
// TODO: 数値を保持する SmartBox<i32> を作成する
// TODO: テキストを保持する SmartBox<String> を作成する
// TODO: get メソッドを使用して値を表示する
// フォーマット: "Value: {value}"
// main が終了すると、Drop メッセージが自動的に表示されます
}