特质专门化实际上是如何工作的?

3
我试图专门化一个trait,但由于“冲突的实现”,它无法编译通过。但我对专门化的理解是更具体的实现应该覆盖更通用的实现。这里是一个非常基本的例子:
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将允许特定的实现,但它却无法编译。
1个回答

7

专业化尚未稳定。您需要使用 Rust 的夜间版本并通过在第一行添加 #![feature(specialization)] 启用专业化功能。

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

最终代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接