は、私たちは、私は自明A
を実装するすべてのタイプのB
を実装することができ両方の形質が参照用に実装されている場合、どのように形質Aを実装するすべての型に対して特性Bを実装できますか?
- ための2つの特徴
A
とB
を持っています。 A
を実装しているすべてのタイプへの参照として、私は自明にA
を実装できます。B
を実装している任意のタイプへの参照のために、私は簡単にB
を実装できます。
実際にA
を実装する型への参照には、B
という2つの実装が存在するため、3つをすべて実行すると競合が発生します。原因推移によるimpl<T: A> B for T
(その後、impl<T: B> B for &T
へimpl<T: A> A for &T
と一対一。
B
なくA
を実装する型があるかもしれないので、私は、impl<T: B> B for &T
を削除することはできませんがここで示すサンプルコードです行動、次のエラーが発生し
trait A {}
trait B {}
impl<'a, T: A> A for &'a T {}
impl<T: A> B for T {}
impl<'a, T: B> B for &'a T {}
:。
error[E0119]: conflicting implementations of trait `B` for type `&_`:
|
| impl<T: A> B for T {}
| --------------------- first implementation here
| impl<'a, T: B> B for &'a T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
impl B for &A
がある場合、&B
のために作成しないように、Rustタイプシステムを使用できますか?
[ブログの投稿](http://smallcultfollowing.com/babysteps/blog/2016/09/24/intersection-impls/)と[内部についてのスレッド](https://internals.rust-lang .org/t/blog-post-intersection-impls/4129)には多くの議論があります。要約は一般的に「まだ」ではありませんが、そこには役立つかもしれないアイディアがいくつかあるかもしれません。 –
@ChrisEmerson:これは答えに値するでしょうか? –