2016-11-22 8 views
4

は、私たちは、私は自明Aを実装するすべてのタイプのBを実装することができ両方の形質が参照用に実装されている場合、どのように形質Aを実装するすべての型に対して特性Bを実装できますか?

  1. ための2つの特徴ABを持っています。
  2. Aを実装しているすべてのタイプへの参照として、私は自明にAを実装できます。
  3. Bを実装している任意のタイプへの参照のために、私は簡単にBを実装できます。

実際にAを実装する型への参照には、Bという2つの実装が存在するため、3つをすべて実行すると競合が発生します。原因推移によるimpl<T: A> B for T(その後、impl<T: B> B for &Timpl<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タイプシステムを使用できますか?

+2

[ブログの投稿](http://smallcultfollowing.com/babysteps/blog/2016/09/24/intersection-impls/)と[内部についてのスレッド](https://internals.rust-lang .org/t/blog-post-intersection-impls/4129)には多くの議論があります。要約は一般的に「まだ」ではありませんが、そこには役立つかもしれないアイディアがいくつかあるかもしれません。 –

+0

@ChrisEmerson:これは答えに値するでしょうか? –

答えて

3

このトピックにはdiscussion on the Rust internals forumがあり、重複した形質の実装の問題を処理する方法についてはa blog post by Nicholas Matsakisから始まっています。

今日(不安定な)錆はsome impl specialisationですが、より一般的なものの厳密により具体的な意味でのみ機能します。

私は、今日はそれを行うには良い方法がないと思っていますが、将来のある時点で、Rustは重複した形質を表現することができるように進化するという良いチャンスがあります。

関連する問題