断言特征对象相等?
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))
}
通常的 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))
}