仅为特定字段派生属性,就像 serde 一样
Derive attribute for specific fields only, like serde does
使用 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 库允许这样的序列化。
不,目前 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
函数,其中 returns 所有有用字段的元组并使用它。
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()
}
}
使用 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 库允许这样的序列化。
不,目前 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
函数,其中 returns 所有有用字段的元组并使用它。
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()
}
}