標準ライブラリが拡張トレイトを使用する理由(cfg でガードされた項目ではなく)
標準ライブラリでよく見られるパターンは、ターゲット固有のメソッドを、
オブジェクト自体に直接 cfg でガードされたメソッドとして提供するのではなく、
拡張トレイトに入れることです。たとえば、
std::os::unix::prelude
にある多数の拡張トレイトは、標準型に UNIX 固有のメソッドを提供します。
標準ライブラリは、その代わりに、#[cfg(unix)] でガードしたうえで、
これらのメソッドを標準型に直接提供することもできるでしょう。しかし、そうしておらず、
cfg でガードされたメソッドを追加する PR はしばしば却下されます。
これらのメソッドを拡張トレイト経由で提供すると、コードはメソッドにアクセスするために、
それらの拡張トレイトを明示的に使用することを強制されます。これは事実上、
そのコードがターゲット固有の機能に依存しているかどうかを宣言することを要求します。
それは、そのコードがターゲット固有であるためか、あるいは異なるターゲット向けに適切に
cfg でガードされたコードを持っているためです。これらの拡張トレイトがなければ、
コードはターゲット固有の機能をより簡単に「偶然」使用してしまう可能性があります。
Rust が、ターゲット固有の機能にアクセスする前に、コードが自身の移植性、または移植性がないことを 明示的に宣言するのを支援する、より優れた仕組みを開発した場合、 このポリシーは将来変更される可能性があります。