Невозможно переместиться из заимствованного содержимого в 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
для этого типа себя тоже.