簡體   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