3

使用derive语法,我可以实现类似HashPartialEq使用特定字段的特征,而不是全部?

它可能看起来像:

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

我希望该hash方法仅使用idname而没有其他方法。

serde库允许这样的序列化

4

1 回答 1

6

不,目前 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()
    }
}
于 2016-04-11T15:53:40.140 回答