Атрибут получения только для определенных полей, как в serde

С помощью derive синтаксис, я могу реализовать такие черты, как Hash или же PartialEq используя конкретные поля, а не все?

Это может выглядеть так:

#[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 метод только для использования id, а также name и нет других.

Библиотека serde позволяет что-то подобное для сериализации.

2 ответа

Решение

Нет, в данный момент в 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()
    }
}

Это возможно при использовании производной.

Пример:

      use derivative::Derivative;

#[derive(Derivative)]
#[derivative(Hash, PartialEq)]
struct Foo {
    foo: u8,
    #[derivative(Hash="ignore")]
    #[derivative(PartialEq="ignore")]
    bar: u8,
}
Другие вопросы по тегам