孤児ルール (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