2017-06-17 10 views
0

私は特性を特化しようとしましたが、 "実装の矛盾"のためにコンパイルに失敗しました。しかし、専門化の私の理解は、より具体的な実装は、より一般的なものをオーバーライドする必要があります。ここでは非常に基本的な例である:形質特化はどのように実際に機能しますか?

mod diving { 
    pub struct Diver<T> { 
     inner: T 
    } 
} 

mod swimming { 
    use diving; 
    pub trait Swimmer { 
     fn swim(&self) { 
      println!("swimming") 
     } 
    } 

    impl<T> Swimmer for diving::Diver<T> { 

    } 
} 

mod drowning { 
    use diving; 
    use swimming; 
    impl swimming::Swimmer for diving::Diver<&'static str> { 
     fn swim(&self) { 
      println!("drowning, help!") 
     } 
    } 
} 

fn main() { 
    let x = diving::Diver::<&'static str> { 
     inner: "Bob" 
    }; 
    x.swim() 
} 

エラーは次のとおりです。

rustc 1.18.0 (03fc9d622 2017-06-06) 
error[E0119]: conflicting implementations of trait `swimming::Swimmer` for type `diving::Diver<&'static str>`: 
    --> <anon>:23:5 
    | 
15 |/ impl<T> Swimmer for diving::Diver<T> { 
16 | |  
17 | |  } 
    | |_____- first implementation here 
... 
23 |/ impl swimming::Swimmer for diving::Diver<&'static str> { 
24 | |   fn swim(&self) { 
25 | |    println!("drowning, help!") 
26 | |   } 
27 | |  } 
    | |_____^ conflicting implementation for `diving::Diver<&'static str>` 

私は&'static strの実際の型と、より具体的な溺死実装は、特殊な実装を可能にすることを期待しているだろうが、代わりにそれが失敗しましたコンパイルします。

答えて

5

特化はまだ安定していません。 Rustの夜間ビルドを使用し、#![feature(specialization)]を最初の行に追加することで、専門化を有効にする必要があります。

コードに2つの小さなエラー(プライベートinnerフィールドと不足use swimming::Swimmer;)を修正する必要がありますが、それは簡単です。

Final code

関連する問題