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