簡體   English   中英

有什么方法可以在多個特征上實現一個特征?

[英]Is there some way to implement a trait on multiple traits?

為什么這樣不起作用:

trait Update {
    fn update(&mut self);
}

trait A {}
trait B {}

impl<T: A> Update for T {
    fn update(&mut self) {
        println!("A")
    }
}

impl<U: B> Update for U {
    fn update(&mut self) {
        println!("B")
    }
}
error[E0119]: conflicting implementations of trait `Update`:
  --> src/main.rs:14:1
   |
8  | impl<T: A> Update for T {
   | ----------------------- first implementation here
...
14 | impl<U: B> Update for U {
   | ^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation

我認為稍后會檢查類型是否重疊。

您希望該程序的輸出是什么?

struct AAndB {}
impl A for AAndB {}
impl B for AAndB {}

let a_and_b = AAndB {};
a_and_b.update();

有一個不穩定的編譯器功能,即specialization ,您可以在每晚的構建中啟用該功能,該功能可以讓您有重疊的實例,並且使用最“專業化”的功能。

但是,即使啟用了專業化功能,您的示例也將無法正常工作,因為AB完全等效,因此您永遠不會明確選擇一個實例。

只要有一個明顯的“更加專業化”的實例,它將立即按預期的方式編譯和運行-前提是您使用啟用了專業化功能的Rust 每晚構建。 例如,如果一個特征受另一個特征限制,則它更加專業化,因此可以使用:

#![feature(specialization)]

trait Update {
    fn update(&mut self);
}

trait A {}
trait B: A {}

impl<T: A> Update for T {
    default fn update(&mut self) {
        println!("A")
    }
}

impl<U: B> Update for U {
    fn update(&mut self) {
        println!("B")
    }
}

將實現方法指定為default允許另一個更具體的實現定義其自己的方法版本。

暫無
暫無

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

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