Специализация: PartialEq против Rc - PullRequest
2 голосов
/ 06 февраля 2020

Я хотел бы придумать функцию, которая выполняет проверку равенства между двумя значениями. Для T: PartialEq это просто, а для Rc<T> достаточно использовать Rc::ptr_eq, когда T не PartialEq.

Я пытаюсь использовать специализацию для предоставления случая Rc<T: !PartialEq>, но У меня проблемы с перекрывающимися реализациями, поскольку Rc может реализовать PartialEq.

Есть ли способ придумать одну функцию ref_eq, со специализацией или без?

Мой код: ( детская площадка ):

#![feature(specialization)]

use std::fmt::Display;
use std::rc::Rc;

trait RefEq {
    fn ref_eq(&self, other: &Self) -> bool;
}

impl<T> RefEq for T {
    default fn ref_eq(&self, _other: &Self) -> bool {
        false
    }
}

impl<T> RefEq for T where T: PartialEq {
    default fn ref_eq(&self, other: &Self) -> bool {
        self == other
    }
}

// error[E0119]: conflicting implementations of trait `RefEq` for type `std::rc::Rc<_>`:
/*
impl<T> RefEq for Rc<T> {
    fn ref_eq(&self, other: &Self) -> bool {
        Rc::ptr_eq(self, other)
    }
}
*/

fn assert_ref_eq<T>() where T: RefEq { }

fn main() {
    assert_ref_eq::<f64>();             // f64 is PartialEq => ok
    assert_ref_eq::<Rc<String>>();      // String is PartialEq => ok
    assert_ref_eq::<Rc<dyn Display>>(); // dyn Display is not PartialEq =>
                                        //    please use Rc::ptr_eq
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...