由本地定义的公共特征约束的核心特征的一揽子实施

时间:2017-05-03 14:50:42

标签: rust traits

我有以下代码:

pub trait GetIdentifier {
    //...
}
impl<T: GetIdentifier> Hash for T {
     fn hash(&self) -> //....
}

我收到以下错误:

error[E0119]: conflicting implementations of trait `std::hash::Hash` for type `&_`:
  --> <anon>:18:1
   |
18 | / impl<T: GetIdentifier> Hash for T {
19 | | }
   | |_^
   |
   = note: conflicting implementation in crate `core`

error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g. `MyStruct<T>`); only traits defined in the current crate can be implemented for a type parameter
  --> <anon>:18:1
   |
18 | / impl<T: GetIdentifier> Hash for T {
19 | | }
   | |_^

为什么呢?我没有为GetIdentifier实施&_,因此一揽子impl不应适用于&_。我的箱子的消费者也无法为核心类型实施GetIdentifier,所以没有问题。我在这里错过了什么?为什么&_甚至涉及到这里 - 我没有对我的特性施加?Sized限制,所以甚至不应该考虑引用......对吧?

1 个答案:

答案 0 :(得分:1)

您的箱子的消费者可以为ACME A实施GetIdentifier,同时为TheirType实施Hash

现在你可能会说这是他们的问题,但想象另一个具有特征TheirType的箱子Fooimpl<T: Foo> Hash for T {}实施TheirType和{ {1}}。突然间,他们无法实现这两种特质。

Foo发生错误的原因是stdlib impl表示实现GetIdentifier的任何类型&_都会导致T同时实施Hash