断言特征对象相等?

Assert equality of trait objects?

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

我看到的解决方案涉及在特征定义中要求一个 eq 关联函数,这对我没有吸引力,因为这只是调试代码,而且我认为包含方法不会有好处这将是 cargo test 构建之外的特征 API 的无用且可能令人困惑的补充。

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

很可能您应该仅出于调试目的实施所需的任何内容。检查 conditional compilation macros.

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

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

Playground