我正在尝试删除以下示例中的重复项:

struct User {
    reference: String,
    email: String,
}

fn main() {
    let mut users: Vec<User> = Vec::new();
    users.push(User {
        reference: "abc".into(),
        email: "[email protected]".into(),
    });
    users.push(User {
        reference: "def".into(),
        email: "[email protected]".into(),
    });
    users.push(User {
        reference: "ghi".into(),
        email: "[email protected]".into(),
    });

    users.sort_by(|a, b| a.email.cmp(&b.email));
    users.dedup();
}

我收到错误

error[E0599]: no method named `dedup` found for type `std::vec::Vec<User>` in the current scope
  --> src/main.rs:23:11
   |
23 |     users.dedup();
   |           ^^^^^
   |

如何通过 users 值从 email 中删除重复项?我可以为 dedup() 实现 struct User 函数还是必须做其他事情?

最佳答案

如果您查看 Vec::dedup 的文档,您会注意到它位于由以下标记的一小部分中:

impl<T> Vec<T>
where
    T: PartialEq<T>,

这意味着它下面的方法只有在满足给定的约束时才存在。在这种情况下, dedup 不存在,因为 User 没有实现 PartialEq 特性。较新的编译器错误甚至明确指出:

   = note: the method `dedup` exists but the following trait bounds were not satisfied:
           `User : std::cmp::PartialEq`

在这种特殊情况下,您可以派生 PartialEq :
#[derive(PartialEq)]
struct User { /* ... */ }

推导出所有适用的特征通常是一个好主意;导出 EqCloneDebug 可能是个好主意。



您可以使用 Vec::dedup_by :
users.dedup_by(|a, b| a.email == b.email);

在其他情况下,您也许可以使用 Vec::dedup_by_key

关于rust - 如何从自定义结构向量中删除重复项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30977752/

10-10 18:34