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.