İki A ve B sınıflarım var ve bir HashMap kullanmak istiyorum. Böyle bir kod vardır:Eq ve Hash'u kendi yapılarım için HashMap'te kullanmak üzere nasıl uygulanır?
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});
}
Fakat derleyici bana bu hataları veriyor:
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]
Ben bu özellikleri uygulamak gerektiğini biliyorum, ama internet arama saat sonra ben uygulama hakkında hiçbir şey bulduk onlar.
Lütfen, nasıl yapılacağını bana bir örnek verin.
Düzenleme: Aslında, kodum daha karmaşık ve benim yapılarım başka yapıları (kod düzenlenmiş) içeriyor. Ve derleyici Denklemi yapmadığımı şikayet ediyor.
Uyguladığım Karma özelliği. Şu an çok iyi görünüyor.
impl Hash for Application {
fn hash<H>(&self, state: &mut H) where H: Hasher {
state.write_u32(self.pid);
state.finish();
}
}
Ben de PartialEq için bir impl yaptı:: Benim uygulama aşağıdaki gibi olduğunu
impl PartialEq for Application {
fn eq(&self, other: &Application) -> bool {
self.pid == other.pid
}
}
Ama derleyici Denklem hakkında şikayet:
error: the trait
core::cmp::Eq
is not implemented for the typeapp::Application
nasıl Denk uygulayabilirsiniz? ?? Dokümanlarda neden uygulama yok?
Yapınız birbirini izleyen, her biri diğer türden bir alanı bir değer içeriyor. Bu, olduğu gibi derlenemez. – barjak
Bence, 'Hash' kelimesinin basitçe 'self.pid.hash (state)' olmalıdır. Bana göre 'bitirmek' demek hata olur. – barjak