トレイトの導出

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct BufferId([u8; 16]);

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct DrawingBuffer {
    target: [u8; 16],
    commands: Vec<String>,
}
  • 多くのトレイト、プロトコル、インターフェースには、自明な実装があり、 それらは機械的に簡単に書けます。

  • 型の定義(その構文木)は手続きマクロ (コンパイラプラグイン)に渡して、トレイト実装を自動生成できます。

    これらのマクロは誰かが作成しなければならず、コンパイラが すべてを自力で理解できるわけではありません。

  • 多くのトレイトには、素朴で明白な実装があります。ほとんどは、 すべてのフィールドまたはバリアントがすでにそのトレイトを実装していることに依存する実装です。

    PartialEq/Eq は、そのすべてのフィールド / バリアントが それらのトレイトを実装している型であれば、かなり簡単に導出できます。フィールド / バリアントを対応させて並べ、どれか 1 つでも一致しなければ、 等価性チェックは false を返します。

  • derive を使うと、機械的かつ予測可能な形でボイラープレートを避けられます。derive 実装の作者は、そのトレイトの作者であるか、少なくともトレイトの適切な意味論を念頭に置いて derive を実装している可能性が高いです。

  • クラスに質問する: ほとんどのコードが自明なボイラープレートである コードベースを、学生が扱ったことはありますか?

  • これは Haskell の deriving システムに似ています。

参考資料:

  • https://doc.rust-lang.org/reference/attributes/derive.html#r-attributes.derive