Почему Rust ожидает двойной заем (`&& 'mut T`) - PullRequest
0 голосов
/ 29 марта 2019

Мой код выглядит как this :

pub enum Cache<'a, T> {
    Pending(&'a dyn FnOnce() -> T),
    Cached(T),
}

impl<'a, T> Cache<'a, T> {
    pub fn get(&self) -> &mut T {
        // This caches and borrows the T
    }
}

impl<'a, T> PartialEq for Cache<'a, T>
    where &'a mut T: PartialEq {

    fn eq(&self, other: &Self) -> bool {
        self.get().eq(other.get())
    }
}

Но реализация Eq завершается неудачно с:

error[E0308]: mismatched types
--> src/lib.rs:20:23
|
20 |         self.get().eq(other.get())
|                       ^^^^^^^^^^^ expected mutable reference, found type parameter
|
= note: expected type `&&'a mut T`
               found type `&mut T`

Я думаю, что я что-то концептуально неправильно понимаю.

1 Ответ

4 голосов
/ 29 марта 2019

Вы можете понять, почему 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...