snippetrustModerate
How to implement Eq and Hash for my own structs to use them as a HashMap key?
Viewed 0 times
ownkeyhowandstructsuseforhashmaphashthem
Problem
I have two structs,
But the compiler gives me these errors:
I know that I must implement these traits, but after hours of searching the web, I have found nothing about implementing them.
My actual code is more complicated, and my structs contain other structs (I've edited the code).
I've implemented the
I made an implementation for
But the compiler continues to complain, this time about
How can I implement
A and B, and I want to use a HashMap. I have a piece of code like this:use std::collections::HashMap;
pub struct A {
x: i32,
y: i32,
title: String,
}
pub struct B {
a: u32,
b: u32,
}
fn main() {
let map = HashMap::new();
map.insert(
A {
x: 10,
y: 20,
title: "test".to_string(),
},
B { a: 1, b: 2 },
);
}But the compiler gives me these errors:
error[E0277]: the trait bound A: std::cmp::Eq is not satisfied
--> src/main.rs:16:9
|
16 | map.insert(
| ^^^^^^ the trait std::cmp::Eq is not implemented for A
error[E0277]: the trait bound A: std::hash::Hash is not satisfied
--> src/main.rs:16:9
|
16 | map.insert(
| ^^^^^^ the trait std::hash::Hash is not implemented for A
I know that I must implement these traits, but after hours of searching the web, I have found nothing about implementing them.
My actual code is more complicated, and my structs contain other structs (I've edited the code).
I've implemented the
Hash trait:impl std::hash::Hash for A {
fn hash(&self, state: &mut H)
where
H: std::hash::Hasher,
{
state.write_i32(self.x);
state.finish();
}
}I made an implementation for
PartialEq also:impl PartialEq for A {
fn eq(&self, other: &A) -> bool {
self.x == other.x
}
}But the compiler continues to complain, this time about
Eq:error[E0277]: the trait bound A: std::cmp::Eq is not satisfied
--> src/main.rs:16:9
|
16 | map.insert(
| ^^^^^^ the trait std::cmp::Eq is not implemented for A
How can I implement
Eq? Why is there no implementation in the docs?Solution
Eq is what we call a marker trait: it has no method on its own, it is just a way for the programmer to express that the struct verifies a certain property. You can implement it like this:impl Eq for Application {}Or alternatively, use
#[derive(Eq)] on top of the Application declarationEq is a trait bound by PartialEq. This means that you can implement it only on structs that also implement PartialEq (which is the case here). By implementing Eq, you make the promise that your implementation of PartialEq is reflexive (see the docs for what it means).Code Snippets
impl Eq for Application {}Context
Stack Overflow Q#31835647, score: 38
Revisions (0)
No revisions yet.