Атрибут получения только для определенных полей, как в 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,
}