TL;DR
Rust でトレイトを実装するとき、トレイトか型のどちらかが、そのクレートで新たに定義されたものでなければならないという制約。
なぜ必要か
どのクレートでも任意の型に任意のトレイトを実装できると、2 つのクレートが同じ型に同じトレイトを実装したとき、コンパイラはどちらを使えばよいか決められない。孤児ルールがあることで、トレイトの実装が 1 つしかないことが保証され、他人のコードが自分のコードを壊すこともその逆も起きない。
仕組み
外部のトレイトを外部の型に実装することはできない。たとえば、Display と Vec<T> はどちらも標準ライブラリで定義されているので、自分のクレートで Vec<T> に Display を実装することはできない。この制約は coherence(一貫性)と呼ばれる性質の一部である。親となる型が存在しないことから「孤児」ルールと呼ばれる。
関連
出典
- プログラミングRust 第2版
- Traits: Defining Shared Behavior - The Rust Programming Language