Вы можете понять, почему Rust ожидает &&mut T
, взглянув на определение метода eq()
в признаке PartialEq
:
fn eq(&self, other: &Rhs) -> bool;
Типы параметров этого метода: &Self
и &Rhs
; поскольку Rhs
по умолчанию равно Self
и вы не указали ничего другого в своей границе черты, ожидается, что оба аргумента будут иметь тип &Self
.
Теперь, что такое Self
в этом случае? Ваша черта связана с этим:
&'a mut T: PartialEq
Таким образом, единственная реализация PartialEq
, которую может использовать компилятор, - это реализация для типа &'a mut T
, так что это то, чем является Self
; &Self
, в свою очередь, должно быть &&'a mut T
, что именно то, что ожидает компилятор.
Возможно, вы хотите, чтобы черта была привязана к T
вместо:
impl<'a, T> PartialEq for Cache<'a, T>
where
T: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
self.get() == other.get()
}
}
Также обратите внимание, что вы можете просто использовать ==
вместо явного вызова eq()
. Это немного упрощает правильное приведение типов, поскольку компилятор неявно принимает ссылки на аргументы - a == b
расширяется до PartialEq::eq(&a, &b)
.