2016-04-11 8 views
0

Verwenden derive Syntax kann ich Traits wie Hash oder PartialEq mit bestimmten Feldern, nicht alle von ihnen implementieren?Ableiten Attribut für bestimmte Felder nur, wie serde tut

Es könnte wie folgt aussehen:

#[derive(Debug, Hash, Eq, PartialEq)] 
struct MyStruct { 
    id: i32, 
    name: String, 

    #[derive(hash_skip, eq_skip)] 
    aux_data1: f64, 
    #[derive(hash_skip, eq_skip)] 
    aux_data2: f64, 
    #[derive(hash_skip, eq_skip)] 
    aux_data3: String, 
} 

ich die hash Methode nur will id verwenden, und name und keine andere.

Die Bibliothek serde ermöglicht etwa so etwas für die Serialisierung.

Antwort

4

Nein, in Rust gibt es in diesem Moment keine solche Funktion. Was würde ich vorschlagen, ist die Implementierung für Tupel für diese Eigenschaften zu nutzen, wie folgt aus:

use std::hash::{Hash, Hasher}; 

#[derive(Debug)] 
struct MyStruct { 
    id: i32, 
    name: String, 
    aux_data1: f64, 
    aux_data2: f64, 
    aux_data3: String, 
} 

impl Hash for MyStruct { 
    fn hash<H>(&self, state: &mut H) where H: Hasher { 
     (&self.id, &self.name).hash(state); 
    } 
} 

impl PartialEq for MyStruct { 
    fn eq(&self, other: &Self) -> bool { 
     (&self.id, &self.name) == (&other.id, &other.name) 
    } 
} 

Edit: oder als @Shepmaster unten in einem Kommentar vorgeschlagen, können Sie eine key Funktion erstellen, die ein Tupel aller zurück nützliche Felder und verwenden Sie es.

impl MyStruct { 
    fn key(&self) -> (&i32, &String) { 
     (&self.id, &self.name) 
    } 
} 

impl Hash for MyStruct { 
    fn hash<H>(&self, state: &mut H) where H: Hasher { 
     self.key().hash(state); 
    } 
} 

impl PartialEq for MyStruct { 
    fn eq(&self, other: &Self) -> bool { 
     self.key() == other.key() 
    } 
} 
+3

Wenn ich dies getan habe, habe ich es nützlich gefunden, eine 'key' Methode zu erstellen, die das Tupel zurückgibt, das dann verwendet wird, um' hash' und 'eq' (und was auch immer) synchronisiert zu halten Anzahl. – Shepmaster

+0

@Shempmaster Danke, das scheint eine gute Idee zu sein, besonders wenn du> 2 Felder einbeziehen willst. – Dogbert

Verwandte Themen