Rust 检查自定义结构的相等性

Rust 检查自定义结构的相等性,rust,Rust,我试图检查两个(功能相同)结构的相等性 #[派生(PartialEq,调试)] pub结构类型a{ 发布fn新(n:&str)->TypeA{ A型(n) } } 恳求{ 发布fn新(n:&str)->TypeB{ B类(n) } } fn main(){ 断言(TypeA::new(“A”)、TypeB::new(“A”); } 它返回错误: 错误[E0308]:类型不匹配 -->src/main.rs:20:5 | 20 |断言| eq!(A类::新(“A”)、B类::新(“A”); |^

我试图检查两个(功能相同)结构的相等性

#[派生(PartialEq,调试)]
pub结构类型a{
发布fn新(n:&str)->TypeA{
A型(n)
}
}
恳求{
发布fn新(n:&str)->TypeB{
B类(n)
}
}
fn main(){
断言(TypeA::new(“A”)、TypeB::new(“A”);
}
它返回错误:

错误[E0308]:类型不匹配
-->src/main.rs:20:5
|
20 |断言| eq!(A类::新(“A”)、B类::新(“A”);
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注:预期类型为'TypeA`
=注意:此错误源于当前板条箱外部的宏

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

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

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

在这种情况下,您确实需要在两个方向上为这些类型手动实现
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
    }
}
impl PartialEq{
fn eq(&self,other:&TypeB>用于TypeB)->bool{
self.0==其他.0
}
}
之后,您将能够使用
==
断言\u eq!()
用于这些类型对。记住,如果您也需要,您仍然可以在您的类型上保留
#[派生(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
    }
}