检查自定义结构的相等性

and*_*y g 7 rust

我正在尝试检查两个(功能相同)结构的相等性.

#[derive(PartialEq, Debug)]
pub struct TypeA<'a>(&'a str);

#[derive(PartialEq, Debug)]
pub struct TypeB<'a>(&'a str);

impl<'a> TypeA<'a> {
    pub fn new(n: &str) -> TypeA {
        TypeA(n)
    }
}

impl<'a> TypeB<'a> {
    pub fn new(n: &str) -> TypeB {
        TypeB(n)
    }
}

fn main() {
    assert_eq!(TypeA::new("A"), TypeB::new("A"));
}
Run Code Online (Sandbox Code Playgroud)

它返回错误:

error[E0308]: mismatched types
  --> src/main.rs:20:5
   |
20 |     assert_eq!(TypeA::new("A"), TypeB::new("A"));
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `TypeA`, found struct `TypeB`
   |
   = note: expected type `TypeA<'_>`
              found type `TypeB<'_>`
   = note: this error originates in a macro outside of the current crate
Run Code Online (Sandbox Code Playgroud)

似乎派生PartialEq不起作用.是在这两种类型之间手动实现它的唯一解决方案吗?问题完全在别的地方吗?

Vla*_*eev 15

衍生PartialEq确实有效; 但Rust没有不同类型结构平等的概念.如果您#[derive(PartialEq)]在一种类型上书写,并不意味着可以将此类型的值与另一种类型的值进行比较,即使它具有相同的内部结构.它只意味着可以在它们之间比较这种类型的值.

但是,PartialEq有一个右侧操作数的类型参数(创造性地命名Rhs),这意味着您可以PartialEq为具有不同类型参数的单个类型实现多次.#[derive(PartialEq)]只会PartialEq<X>在应用时实现X,但这并不会阻止您实现自己的PartialEq<Y>其他值Y.

在这种情况下,您需要PartialEq在两个方向上手动为这些类型实现:

impl<'a, 'b> PartialEq<TypeB<'b>> for TypeA<'a> {
    fn eq(&self, other: &TypeB<'b>) -> bool {
        self.0 == other.0
    }
}

impl<'a, 'b> PartialEq<TypeA<'a>> for TypeB<'b> {
    fn eq(&self, other: &TypeA<'a>) -> bool {
        self.0 == other.0
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,您将能够使用==assert_eq!()用于这些类型.请记住,#[derive(PartialEq)]如果您需要它,您仍然可以保留您的类型!