簡體   English   中英

特質專業化實際上如何運作?

[英]How does trait specialization actually work?

我試圖專門研究一個特性,由於“沖突的實現”而無法編譯。 但是我對專業化的理解是,更具體的實現應優先於更通用的實現。 這是一個非常基本的示例:

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)]來啟用專業化。

然后,您需要修復代碼中的兩個小錯誤(私有inner字段和缺少use swimming::Swimmer; ),但這很簡單。

最終代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM