[英]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 ,您可以在每晚的構建中啟用該功能,該功能可以讓您有重疊的實例,並且使用最“專業化”的功能。
但是,即使啟用了專業化功能,您的示例也將無法正常工作,因為A
和B
完全等效,因此您永遠不會明確選擇一個實例。
只要有一個明顯的“更加專業化”的實例,它將立即按預期的方式編譯和運行-前提是您使用啟用了專業化功能的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.