【发布时间】:2019-12-08 00:50:14
【问题描述】:
我有这个问题:
- 多个结构实现一个特征
Event - 都可以用同样的方式实现
PartialEqtrait
我考虑过写这个(短版)
type Data = Vec<u8>;
trait Event {
fn data(&self) -> &Data;
}
struct NoteOn {
data: Data,
}
struct NoteOff {
data: Data,
}
impl Event for NoteOn {
fn data(&self) -> &Data {
&self.data
}
}
impl Event for NoteOff {
fn data(&self) -> &Data {
&self.data
}
}
impl<T: Event> PartialEq for T {
fn eq(&self, b: &T) -> bool {
self.data() == b.data()
}
}
fn main() {
println!("Hello, world!");
}
编译失败:
error[E0119]: conflicting implementations of trait `std::cmp::PartialEq<&_>` for type `&_`:
--> src/main.rs:23:1
|
23 | impl<T: Event> PartialEq for T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: conflicting implementation in crate `core`:
- impl<A, B> std::cmp::PartialEq<&B> for &A
where A: std::cmp::PartialEq<B>, A: ?Sized, B: ?Sized;
= note: downstream crates may implement trait `Event` for type `&_`
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> src/main.rs:23:1
|
23 | impl<T: Event> PartialEq for T {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
这里有什么问题?
还是有另一种方法可以通用地实现这个PartialEq,而不必为NoteOn 输入一次,为Noteff 输入一次?
谢谢
【问题讨论】:
-
看来I implemented a trait for another trait but cannot call methods from both traits 的答案可能会回答您的问题。如果没有,请edit您的问题来解释差异。否则,我们可以将此问题标记为已回答。
-
对您的失败进行更多猜测,您的问题可能会得到How is there a conflicting implementation of
Fromwhen using a generic type?的答案。如果没有,请edit您的问题来解释差异。否则,我们可以将此问题标记为已回答。 -
或许您可以解释一下您对编译器帮助信息的不理解之处?
-
@Shepmaster 感谢您的 cmets,我制作了一个游乐场示例和可编译示例(无需板条箱)。问题是冲突,尽管错误消息:T must be used in Local type 对我来说意义不大,因为 T 用作本地类型。再次感谢
-
目前,这是How do I implement a trait I don't own for a type I don't own? 的骗子(回答:你不知道,但有一些变通方法)。更广泛地说,我认为您的问题可以通过How do I make many different structs that all implement the same trait comparable to each other? 和How to test for equality between trait objects? 中的一个或两个来解决(请务必阅读所有答案)。