3

通常的assert_eq!宏要求 PartialEq 跨结构实现 - 我有一个特征对象向量Vec<Box<dyn Element>>,其中 Element 是需要调试的特征,pub trait Element: std::fmt::Debug。我不能同样要求PartialEq,因为它需要 Self 作为类型参数,编译器无法将其制成特征对象。

我见过的解决方案涉及在特征定义中需要一个 eq 关联函数,这对我没有吸引力,因为这只是调试代码,而且我认为包含一个无用的方法是没有好处的并且可能会在cargo test构建之外对 trait 的 API 进行混淆。

有没有其他(可能不安全的)方法来比较两个特征对象?

4

1 回答 1

2

很可能您应该为调试目的实现您需要的任何东西。检查条件编译宏

无论如何,既然您已经知道它们是Debug绑定的,您可以尝试将其用作比较。当然,你需要适当地调整它。

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

操场

于 2021-03-19T09:18:18.747 回答