2015-08-05 8 views
7

İ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 type A [E0277]
error: the trait core::hash::Hash is not implemented for the type A [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 type app::Application

nasıl Denk uygulayabilirsiniz? ?? Dokümanlarda neden uygulama yok?

+0

Yapınız birbirini izleyen, her biri diğer türden bir alanı bir değer içeriyor. Bu, olduğu gibi derlenemez. – barjak

+1

Bence, 'Hash' kelimesinin basitçe 'self.pid.hash (state)' olmalıdır. Bana göre 'bitirmek' demek hata olur. – barjak

cevap

3

Eq bir belirleyici özelliği dediğimiz şeydir: kendi başına bir yöntemi yoktur, programcının belirli bir özelliği yapısının doğruladığını ifade etmesinin bir yoludur.

impl Eq for Application {} 

Veya alternatif olarak, Başvuru ilanının üstünde #[derive(Eq)] kullanın: Böyle bunu uygulayabilirsiniz.

EqPartialEq tarafından bağlı bir özelliktir. Bu, yalnızca PartialEq'u uygulayan yapılarda uygulayabileceğiniz anlamına gelir (burada durum böyle). Eq'u uygulayarak, PartialEq uygulamanızın yansımalı olduğu anlamına gelir (bunun ne anlama geldiğini öğrenmek için belgelere bakın).

+0

Teşekkür ederim. Bunun bir yerde dokümanlar içinde olması gerektiğini düşünüyorum. – Revertron

+0

Gerçekten de, “doc” ve “ParialEq” için API belgesinde bazı örnekler olmalıdır. Yakında biraz eklemeye çalışacağım. – barjak

4

Sen derleyici olabilir sizin yapı bildirimi önce aşağıdakileri ekleyerek sizin için bu örnekleri türetmek:

#[derive(PartialEq, Eq, Hash)] 
pub struct A 
    ... 

Elbette yerine el bunları uygulayabilir. Bunu yapmak isterseniz, traits, Eq ve Hash belgelerini okumalısınız.

+2

soru, karma kendi uygulamasının nasıl yazılacağıdır? – Revertron

+2

nadiren bunu yapmak için sebep var ... Ama @fjh yazdı, hangi özelliği uygulamak için biliyorsanız, belgelere bakın. Sorun yaşarsanız, denediğiniz kodu yayınlayın. –

İlgili konular