2017-06-17 6 views
0

Ich habe versucht, ein Merkmal zu spezialisieren, und es kompiliert wegen "widersprüchlichen Implementierungen" nicht. Aber mein Verständnis von Spezialisierung ist, dass spezifischere Implementierungen allgemeinere Implementierungen überschreiben sollten. Hier ist ein sehr einfaches Beispiel:Wie funktioniert die Merkmalsspezialisierung?

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() 
} 

Der Fehler ist:

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>` 

ich erwartet hätte, dass die spezifischeren Ertrinken Umsetzung mit einer tatsächlichen Art von &'static str spezialisierte Implementierung ermöglichen würde, sondern es scheitert kompilieren.

Antwort

5

Spezialisierung ist noch nicht stabilisiert. Sie müssen den nächtlichen Build von Rust verwenden und die Spezialisierung aktivieren, indem Sie in der ersten Zeile #![feature(specialization)] hinzufügen.

Dann müssen Sie zwei kleinere Fehler in Ihrem Code beheben (private inner Feld und fehlende use swimming::Swimmer;), aber das ist einfach.

Final code