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

基礎知識

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

ルールの必要性

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

仕様

解説 (基本ルール)

トレイトと型の両方が同時に外部クレート由来であってはならない。
言い換えると、どちらか一方はローカル由来でなければならない。

解説 (追加ルール)

外部クレート由来のトレイトでも、ローカル由来の型引数を含む場合、ローカル扱いできる。ただし、それよりも前の型引数または実装対象の型が型パラメタの場合、他のクレートがそこに自身のローカル型を指定するのを優先したいので、その場合は例外となる。

実例

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

  • impl ForeginTrait for ForeginType
  • impl<T> ForeginTrait<MyType> for T
  • impl<T> ForeginTrait<T, MyType> for ForeginType

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

  • impl MyTrait for ForeginType
  • impl ForeginTrait for MyType
  • impl<T> ForeginTrait<MyType> for ForeginType
  • impl<T> ForeginTrait<MyType, T> for ForeginType
  • impl<T> ForeginTrait<ForeginType2, MyType> for ForeginType
  • impl<T> ForeginTrait<Cover<T>, MyType> for ForeginType