Rust組込みトレイトのコヒーレンス

以下のトレイトは通常のコヒーレンス規則に加えて、特別なコヒーレンス規則が適用される。

Sized, Unsize

Sized, Unsize の手動実装を与えることはできない

Fn, FnMut, FnOnce

Fn, FnMut, FnOnce の手動実装は安定版では禁止されており、 #![feature(unboxed_closures)] が必要である

Drop

Dropはユーザー定義の構造体・列挙型・共用体にのみ定義できる。

また、(なぜかコヒーレンスチェッカーではなくDropチェッカーの一部になっているが)Drop は元の構造体・列挙型・共用体のジェネリクスを特殊化してはならない。これにより Drop は、各ADT型に対して定義されるか、定義されないかのどちらかになる。

Copy

Copy の実装は以下の条件を満たしている必要がある。

  • Self はユーザー定義の構造体・列挙型・共用体である。
  • その impl に課された境界から、各フィールドが Copy であることを結論づけられる。
  • この構造体・列挙型・共用体は Drop を実装していない。

CoerceUnsized

CoerceUnsized の実装は以下の条件を満たしている必要がある。

  • 両辺ともポインタ/参照型であるか、両辺とも構造体である。
  • ポインタ/参照型の場合、 (これは libcore で網羅されている)
    • ポインタからポインタ、ポインタから参照、参照から参照のいずれかである必要がある。
    • mut から mut, mut から const, const から const のいずれかである必要がある。
    • 参照から参照への場合は、大きいリージョン(部分型づけの意味では小さい)から小さいリージョン(部分型づけの意味では大きい)への変換である必要がある。
  • 構造体の場合、
    • 両辺が同じ定義を指している必要がある。
    • 両辺のフィールドをそれぞれ単一化したとき、ちょうど1個だけが失敗する必要がある。
    • 単一化が失敗したフィールドに対して同様に CoerceUnsized が成り立っている必要がある。