Ich habe zwei eigene Klassen A und B und möchte eine HashMap verwenden. Ich habe einen Code wie folgt:Wie implementiert Eq und Hash für meine eigenen Strukturen, um sie in HashMap zu verwenden?
use std::collections::HashMap;
pub struct A
{
x: i32,
y: i32,
title: String,
b_obj: B,
}
pub struct B
{
a: u32,
b: u32,
a_obj: A,
}
fn main()
{
let map = HashMap::new();
map.insert(A{x: 10, y: 20, title: "test".to_string()}, B{a: 1, b: 2});
}
Aber der Compiler gibt mir diese Fehler:
error: the trait
core::cmp::Eq
is not implemented for the typeA
[E0277]
error: the traitcore::hash::Hash
is not implemented for the typeA
[E0277]
Ich weiß, dass ich diese Eigenschaften implementieren müssen, aber nach Stunden der Internet-Suche habe ich nichts gefunden, über die Implementierung Sie.
Bitte, geben Sie mir ein Beispiel, wie man das macht.
Bearbeiten: Eigentlich ist mein Code komplizierter und meine Strukturen enthalten andere Strukturen (Ich habe Code bearbeitet). Und Compiler beschweren sich, dass ich Gl.
Die Hash-Eigenschaft, die ich implementiert habe. Es scheint jetzt so richtig. Meine Implementierung ist wie folgt:
impl Hash for Application {
fn hash<H>(&self, state: &mut H) where H: Hasher {
state.write_u32(self.pid);
state.finish();
}
}
ich eine impl für PartialEq auch gemacht:
impl PartialEq for Application {
fn eq(&self, other: &Application) -> bool {
self.pid == other.pid
}
}
Aber der Compiler über Eq beschwert:
error: the trait
core::cmp::Eq
is not implemented for the typeapp::Application
Wie kann ich Gl implementieren? ?? Warum gibt es keine Implementierung in den Dokumenten?
Ihre Strukturen sind gegenseitig rekursiv, jeder enthält ein Feld des anderen Typs nach Wert. Dies kann nicht so wie es ist kompiliert werden. – barjak
Ich denke, dein Impl von 'Hash' sollte einfach' self.pid.hash (state) 'sein. Für mich ist es ein Fehler, 'Finish' zu nennen. – barjak