gpt4 book ai didi

generics - 有没有办法在多个特征上实现一个特征?

转载 作者:行者123 更新时间:2023-11-29 08:06:17 26 4
gpt4 key购买 nike

为什么这行不通:

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 允许另一个更具体的实现来定义它自己的方法版本。

关于generics - 有没有办法在多个特征上实现一个特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com