Невозможно переместиться из заимствованного содержимого в enum, содержащем объект в штучной упаковке, при получении PartialEq

Я пытаюсь написать вывод enum PartialEq который содержит объект черты, который делает это вручную. Я использовал решение здесь, чтобы заставить разработчиков Trait написать метод равенства. Это не в состоянии скомпилировать:

trait Trait {
    fn partial_eq(&self, rhs: &Box<Trait>) -> bool;
}

impl PartialEq for Box<Trait> {
    fn eq(&self, rhs: &Box<Trait>) -> bool {
        self.partial_eq(rhs)
    }
}

#[derive(PartialEq)]
enum Enum {
    Trait(Box<Trait>),
}
error[E0507]: cannot move out of borrowed content
  --> src/main.rs:13:11
   |
13 |     Trait(Box<Trait>),
   |           ^^^^^^^^^^^ cannot move out of borrowed content

Это компилируется только когда я вручную impl PartialEq for Enum, Почему это так?

1 ответ

Решение

Расширение автоматически получаемой реализации PartialEq представляет лучшее сообщение об ошибке:

impl ::std::cmp::PartialEq for Enum {
    #[inline]
    fn eq(&self, __arg_0: &Enum) -> bool {
        match (&*self, &*__arg_0) {
            (&Enum::Trait(ref __self_0), &Enum::Trait(ref __arg_1_0)) => {
                true && (*__self_0) == (*__arg_1_0)
            }
        }
    }
    #[inline]
    fn ne(&self, __arg_0: &Enum) -> bool {
        match (&*self, &*__arg_0) {
            (&Enum::Trait(ref __self_0), &Enum::Trait(ref __arg_1_0)) => {
                false || (*__self_0) != (*__arg_1_0)
            }
        }
    }
}
error[E0507]: cannot move out of borrowed content
  --> src/main.rs:21:40
   |
21 |                 true && (*__self_0) == (*__arg_1_0)
   |                                        ^^^^^^^^^^^^ cannot move out of borrowed content

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:29:41
   |
29 |                 false || (*__self_0) != (*__arg_1_0)
   |                                         ^^^^^^^^^^^^ cannot move out of borrowed content

Это отслеживается как проблемы ржавчины 31740 и 39128.

Вам, вероятно, нужно будет реализовать PartialEq для этого типа себя тоже.

Другие вопросы по тегам