2017-06-17 82 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)]来启用专业化。

然后,您需要修正代码中的两个小错误(专有inner字段和缺少use swimming::Swimmer;),但这很简单。

Final code