rust - 特质特化实际上是如何运作的?

标签 rust specialization

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

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

最佳答案

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

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

Final code

关于rust - 特质特化实际上是如何运作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44600646/

相关文章:

json - Rust & Serde JSON 反序列化示例?

c++ - 编译器如何知道使用模板特化而不是它自己的实例化?

compiler-errors - 在 Rust 中,我可以从模块中公开函数数组吗?

c++ - 在模板化函数不明确的情况下表达偏好

c++ - 是否可以专门研究某些(不是全部)类模板参数?

C++ 专门针对枚举的函数

c++ - 模板类模板成员的模板特化

rust - 可以编写什么样的 Rust 插件/语法扩展,它们在哪里记录?

MongoDB Rust 客户端连接错误

rust - 从 Option 借来的 RefMut 生命周期不够长 (Option<Rc<RefCell<Node>>>)