我正在尝试删除以下示例中的重复项:
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 { /* ... */ }
推导出所有适用的特征通常是一个好主意;导出
Eq
、 Clone
和 Debug
可能是个好主意。您可以使用
Vec::dedup_by
:users.dedup_by(|a, b| a.email == b.email);
在其他情况下,您也许可以使用
Vec::dedup_by_key
关于rust - 如何从自定义结构向量中删除重复项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30977752/