TL;DR

Rust でトレイトを実装するとき、トレイトか型のどちらかが、そのクレートで新たに定義されたものでなければならないという制約。

なぜ必要か

どのクレートでも任意の型に任意のトレイトを実装できると、2 つのクレートが同じ型に同じトレイトを実装したとき、コンパイラはどちらを使えばよいか決められない。孤児ルールがあることで、トレイトの実装が 1 つしかないことが保証され、他人のコードが自分のコードを壊すこともその逆も起きない。

仕組み

外部のトレイトを外部の型に実装することはできない。たとえば、Display と Vec<T> はどちらも標準ライブラリで定義されているので、自分のクレートで Vec<T> に Display を実装することはできない。この制約は coherence(一貫性)と呼ばれる性質の一部である。親となる型が存在しないことから「孤児」ルールと呼ばれる。

関連

出典