我正在尝试检查两个(功能相同)结构的相等性.
#[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)]如果您需要它,您仍然可以保留您的类型!
| 归档时间: |
|
| 查看次数: |
2638 次 |
| 最近记录: |