孤児ルール (orphan rule) について。

基礎知識

E0119 - トレイト実装の衝突』で紹介する通り、トレイト実装時に同じ型と同じトレイトの組合せですでに他に実装があると、それらが衝突してエラーになる。

ルールの必要性

もし仮に、この衝突が完成済のクレートのトレイト実装どうしでもあるなら、新しいクレートの導入のたびに既存のクレートとの相性確認が必要になってしまう。そのため、孤児ルールではそうした衝突がないよう、予め各クレートが実装できる範囲を制限している。

仕様

解説 (基本ルール)

トレイトに型パラメタがない場合について。

トレイトと型の両方が同時に外部クレート由来であってはならない。

解説 (特別ルール)

トレイトに型パラメタがある場合について。

トレイトが外部クレート由来でも、型パラメタによっては、問題にならなくなる。

まず、少なくとも一つの指定は、ローカルクレートに由来する型である必要がある。さらに、それよりも手前の型パラメタの指定には、単独の型パラメタがあってはならない。なぜなら、他のクレートの同様のトレイト実装にて、そのパラメタの箇所のみを、そのクレート由来の型に置き換えたものがあるかもしれない。

実例

以下は確実にコンパイルエラーになる。

  • impl YourTrait for YourType
  • impl<T> YourTrait<T, MyType> for YourType

以下は E0119 が発生しなければコンパイルできる。

  • impl MyTrait for YourType
  • impl YourTrait for MyType
  • impl<T> YourTrait<MyType> for YourType
  • impl<T> YourTrait<MyType, T> for YourType
  • impl<T> YourTrait<YourType2, MyType> for YourType
  • impl<T> YourTrait<Cover<T>, MyType> for YourType