Я хотел бы придумать функцию, которая выполняет проверку равенства между двумя значениями. Для 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
}