← Rust コース
51. dyn Trait — 異なる型を同じ入れ物に
Box<dyn Trait> と書くと「このトレイトを実装した何かの型」を指す「トレイトオブジェクト」になります。Vec<Box<dyn Shape>> のようにすれば、Circle と Square のような異なる型をひとつのベクタに入れて、共通のメソッドを同じ書き方で呼び出せます。
GUI の描画要素やプラグインの一覧のように、「中身の種類は実行時まで分からないが、同じ操作さえできればよい」場面の定番です。列挙型で型を列挙する方法と違い、あとから新しい型を追加しても一覧を処理するコードは変えずに済みます。
トレイトオブジェクトは具体的な型がコンパイル時に決まらずサイズも不定なので、Box や & などのポインタ越しでしか持てません。Vec<dyn Shape> とは書けず、Vec<Box<dyn Shape>> になると覚えておきましょう。
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Rust
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗