導出

サポートされているトレイトは、次のようにしてカスタム型に自動実装できます。

// 著作権 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

#[derive(Debug, Clone, Default)]
struct Player {
    name: String,
    strength: u8,
    hit_points: u8,
}

fn main() {
    let p1 = Player::default(); // Default トレイトは `default` コンストラクタを追加します。
    let mut p2 = p1.clone(); // Clone トレイトは `clone` メソッドを追加します。
    p2.name = String::from("EldurScrollz");
    // Debug トレイトは `{:?}` を使った出力をサポートします。
    println!("{p1:?} vs. {p2:?}");
}
  • 導出はマクロによって実装されており、多くのクレートが有用な機能を追加するための便利な derive マクロを提供しています。たとえば、serde#[derive(Serialize)] を使って構造体のシリアライズ対応を導出できます。

  • 導出は通常、多くの場合に正しい共通の定型実装を持つトレイトに対して提供されます。たとえば、手動の Clone 実装が、トレイトを導出する場合と比べてどれほど冗長になり得るかを示しましょう。

    // 著作権 2023 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    impl Clone for Player {
        fn clone(&self) -> Self {
            Player {
                name: self.name.clone(),
                strength: self.strength.clone(),
                hit_points: self.hit_points.clone(),
            }
        }
    }

    この場合、上記の .clone() のすべてが必要というわけではありませんが、これは手動実装が一般的に従う定型的なパターンを示しており、学生に derive の使用を明確に伝える助けになります。