W.I.S. Laboratory
menu-bar

Rust


Rustのトレイトをトレイトっぽく使ったりインターフェースっぽく使ったりしてみる

「Rustのトレイトはトレイトじゃない!名称詐欺だ!」というような記事を時々見かける。
たしかにRustのトレイトは純粋にトレイトかと言われると、トレイトじゃない気がする。
巷ではよく「Rustのトレイトはインターフェースに近い」と言われているが、メソッドのデフォルト実装ができ、それらを構造体へimplして使うことができる点でインターフェースでもないと思う。
ミックスインかと言われると、そもそもミックスインという言葉をどう捉えるのかが人によって異なるので、なんともいえない。
ちなみに私はミックスインを「複数のメソッド集合をクラス内に含める作法のこと」だと思っている。
ミックスインされるメソッド集合は、トレイトだったり、メソッドのみで構成されたクラスだったり、モジュールだったりと言語によって異なるが少なくとも「ミックスイン」をプログラミング言語の「機能名」ではなく、「作法の呼び名」だと認識している。

話が逸れたが、Rustのトレイトは一般的なトレイトのように使うこともできる。
このような使い方をした場合、インターフェースとはとても呼べない。
ただしRustは複数のトレイトに同名のメソッドがあった場合、エラーとなってコンパイルできない。(一般的には同名メソッドは上書きされる)

インターフェースとして使うときは、トレイトにはメソッドの実態を書かず、シグネチャのみを記述する。
こうすると、構造体へのメソッド実装を強制することができる。
トレイトを定義する際、トレイト名の後にコロンを置いて他のトレイト名を書くと、実装強制力を継承(紐づけ)できるので、impl忘れを防ぐことができる。


[ 戻る ]
saluteweb