繁体   English   中英

特征`PartialEq <option<_> &gt;` 未实现</option<_>

[英]the trait `PartialEq<Option<_>>` is not implemented

我有一个结构,我从中得到了一些东西。

#[derive(PartialEq, Debug)]
    struct Subscriber {
        id: u16,
        up_speed: u32,
        down_speed: u32
    }

但是,当我尝试使用 PartialEq 时,我被告知它没有实现。

for (id, subscriber) in &new_hashmap {

        let original_subscriber = original_hashmap.get(id).unwrap();

        if original_subscriber == None {
            changed_hashmap.insert(subscriber.id, subscriber);
        } else if subscriber != original_subscriber {
            changed_hashmap.insert(subscriber.id, subscriber);
        }
    }

这是编译器错误。

error[E0277]: can't compare `&Subscriber` with `Option<_>`
  --> src/main.rs:34:32
   |
34 |         if original_subscriber == None {
   |                                ^^ no implementation for `&Subscriber == Option<_>`
   |
   = help: the trait `PartialEq<Option<_>>` is not implemented for `&Subscriber`
   = help: the trait `PartialEq` is implemented for `Subscriber`

如果我将其重写为不将original_subscriber放入它自己的变量中,那么它可以工作。

for (id, subscriber) in &new_hashmap {

        if original_hashmap.get(id) == None {
            changed_hashmap.insert(subscriber.id, subscriber);
        } else if subscriber != original_hashmap.get(id).unwrap() {
            changed_hashmap.insert(subscriber.id, subscriber);
        }
    }

代码的rest本质上是在做下面的事情。

  1. 创建 2 个订阅者实例的 HashMap。
  2. 创建另一个 HashMap 的 3 个订阅者实例,其中 1 个是新的,其中 1 个是相同的,其中 1 个具有相同的键但更新了值。

即 original_hashmap HashMap 和 new_hashmap。

目标是在 new_hashmap 中获得第三个 HashMap 项目,这些项目对于 original_hashmap 来说是新的或已更改值。

您的代码不起作用有两个原因。

  1. 如果您派生 PartialEq,它将仅适用于订阅者 == 订阅者检查。 您需要实现PartialEq<Type>
  2. 比较时您正在使用参考。 这意味着您需要为 &Subscriber 而不是订阅者实现 PartialEq

这应该可以解决问题

 #[derive(PartialEq, Debug)]
    struct Subscriber {
        id: u16,
        up_speed: u32,
        down_speed: u32,
    }

    let subscriber = Subscriber {
        id: 1,
        up_speed: 100,
        down_speed: 100,
    };

    impl PartialEq<Option<Subscriber>> for &Subscriber {
        fn eq(&self, other: &Option<Subscriber>) -> bool {
            match other {
                Some(other) => return other == *self,
                None => return false,
            }
        }
    }

    if &subscriber == None {
        println!("None");
    } else {
        println!("Some");
    }

但我不确定这是否真的是你想要的。 我将尝试实施相同的操作并在之后编辑我的答案

我想这就是你想要实现的

use std::collections::HashMap;

#[derive(Debug, PartialEq)]
struct Subscriber {
    id: u16,
    up_speed: u32,
    down_speed: u32,
}

impl Subscriber {
    fn new(id: u16, up_speed: u32, down_speed: u32) -> Subscriber {
        Subscriber {
            id,
            up_speed,
            down_speed,
        }
    }
}

fn main() {
    let mut old_map = HashMap::new();
    old_map.insert(1, Subscriber::new(1, 1, 1));
    old_map.insert(2, Subscriber::new(2, 2, 2));

    let mut new_map = HashMap::new();
    new_map.insert(0, Subscriber::new(0, 0, 0)); //new
    new_map.insert(1, Subscriber::new(1, 1, 1)); //Same
    new_map.insert(2, Subscriber::new(3, 3, 3)); //Same key but different value

    let mut changed_map = HashMap::new();
    //
    for (key, subscriber) in &new_map {
        if old_map.contains_key(&key) {
            if old_map[&key] != *subscriber {
                changed_map.insert(key, subscriber);
            }
        } else {
            changed_map.insert(key, subscriber);
        }
    }

    println!("{:?}", changed_map);
}

它会回来
{2: Subscriber { id: 3, up_speed: 3, down_speed: 3 }, 0: Subscriber { id: 0, up_speed: 0, down_speed: 0 }}

我使用 deref 运算符来避免impl PartialEq<Subscriber> for &Subscriber但你也可以这样做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM