Утверждать равенство трейт-объектов?

Обычный макрос assert_eq! требует, чтобы PartialEq был реализован в структуре — у меня есть вектор трейт-объектов, Vec<Box<dyn Element>>, где Element — это трейт, требующий отладки, pub trait Element: std::fmt::Debug. Точно так же я не могу требовать PartialEq, так как он требует Self в качестве параметра типа, который компилятор не может преобразовать в трейт-объект.

Решения, которые я видел, включают в себя требование функции, связанной с eq, в определении черты, что мне не нравится, поскольку это просто отладочный код, и я не думаю, что было бы выгодно включать метод, который был бы бесполезным. и потенциально сбивающее с толку дополнение к API трейта за пределами сборки cargo test.

Есть ли другой (потенциально небезопасный) способ сравнить два типаж-объекта?


person CtrlAltF2    schedule 19.03.2021    source источник
comment
Каким-то образом вам нужно будет решить вопрос о том, как сравнивать MyElement с YourElement -- если сравнения выходов Debug достаточно, это нормально, но в большинстве случаев, когда сравнение значений разных типов имеет смысл, вам понадобится что-то более похожее на то, что найдено в связанном вопросе.   -  person trentcl    schedule 20.03.2021


Ответы (1)


Скорее всего, вам следует реализовать все, что вам нужно, только для целей отладки. Проверьте макросы условной компиляции.

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

fn compare_elements_by_debug_fmt<T>(e1: &T, e2: &T) -> std::cmp::Ordering
where 
    T: Debug,
{
    format!("{:?}", e1).cmp(&format!("{:?}", e2))
}

Игровая площадка

person Netwave    schedule 19.03.2021