特质专业化实际上是如何运作的? [英] How does trait specialization actually work?

查看:44
本文介绍了特质专业化实际上是如何运作的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图专门化一个特征,但由于实现冲突"而无法编译.但我对专业化的理解是,更具体的实现应该覆盖更通用的实现.这是一个非常基本的例子:

I tried to specialize a trait, and it fails to compile because of "conflicting implementations". But my understanding of specialization is that more specific implementations should override more generic ones. Here is a very basic example:

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 实际类型的更具体的淹没实现将允许专门的实现,但它无法编译.

I would have expected that the more specific drowning implementation with an actual type of &'static str would allow specialized implementation, but instead it fails to compile.

推荐答案

专业化尚未稳定.您需要使用 Rust 每晚构建并通过在第一行添加 #![feature(specialization)] 来启用专业化.

Specialization is not yet stabilized. You need to use nightly build of Rust and enable specialization by adding #![feature(specialization)] in the first line.

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

Then you'll need to fix two minor errors in your code (private inner field and lack of use swimming::Swimmer;), but that is straightforward.

最终代码

这篇关于特质专业化实际上是如何运作的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆