2016-04-11 7 views
0

derive構文を使用して、HashまたはPartialEqのような特質を実装できますか?serdeのような特定のフィールドのみの派生属性

それは次のようになります。私はid、およびnameなし他人を使用するhash方法をしたい

#[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, 
} 

serdeライブラリでは、このようなシリアル化が可能です。

答えて

4

いいえ、この時点でRustにそのような機能はありません。

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) 
    } 
} 

編集:私は何を示唆していることは、このように、これらの特性のために利用できるタプルのための実装を使用することですか@Shepmasterは以下のコメントで示唆されているように、あなたはすべてのタプルを返すkey関数を作成することができます有用なフィールドとそれを使用します。

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

これを行う際に、タプルを返す 'key'メソッドを作成し、' hash'と 'eq'(そして他のもの)をすべて順番に同期させて保持するのに便利です。カウント。 – Shepmaster

+0

@Shepmasterありがとう、それは良いアイデアのようです、特に> 2フィールドを含める場合。 – Dogbert

関連する問題