Не может выйти из «Rc» - PullRequest
1 голос
/ 09 мая 2019

Получение PartialEq для перечисления с единичным вариантом объекта Rc trait, похоже, вызывает ошибку Cannot move out of an 'Rc'.

Мне удалось создать небольшой пример кода, который воспроизводит ошибку.Есть ли способ исправить ошибку без ручной реализации PartialEq для перечисления?Это происходит в 5 местах кодовой базы.

Пример кода:

use failure::Error;
use serde_derive::{Deserialize,Serialize};
use std::rc::Rc;

trait MyTrait {
}

impl PartialEq for MyTrait {
    fn eq(&self, rhs: &Self) -> bool {
        true
    }
}

impl MyTrait for String {
}

#[derive(PartialEq)]
enum MyEnum {
    A,
    B(Rc<dyn MyTrait>),
}

fn main() -> Result<(), Error> {
    println!("{}",MyEnum::A == MyEnum::B(Rc::new(String::from("whee"))));
    Ok(())
}

Вот сгенерированный PartialEq:

#[inline]
fn eq(&self, other: &MyEnum) -> bool {
    {
        let __self_vi =
            unsafe { ::std::intrinsics::discriminant_value(&*self) } as
                isize;
        let __arg_1_vi =
            unsafe { ::std::intrinsics::discriminant_value(&*other) } as
                isize;
        if true && __self_vi == __arg_1_vi {
            match (&*self, &*other) {
                (&MyEnum::B(ref __self_0), &MyEnum::B(ref __arg_1_0)) =>
                (*__self_0) == (*__arg_1_0),
                _ => true,
            }
        } else { false }
    }
}

А вот ссылка на проблему: https://github.com/rust-lang/rust/issues/31740

Так что это может быть просто языковой баг прямо сейчас.Внедрение PartialEq вручную для всех перечислений, для которых эта проблема сейчас неосуществима, поэтому мне было бы любопытно, если есть обходной путь.

...