导数不忽略比较字段
Derivative not ignoring fields for comparison
我有以下数据结构。当我对其进行二进制搜索并传入 &limit_price
时,它仅在 size
和 orders
中的值也匹配时才匹配。因为我忽略了 PartialEq
,所以我认为它应该只匹配 price
字段。
我是不是漏掉了什么?
#[derive(Derivative)]
#[derivative(Hash, PartialEq, Eq, PartialOrd, Ord, Debug)]
struct LimitPrice {
price: OrderedFloat<f32>,
#[derivative(Hash="ignore", PartialEq = "ignore", PartialOrd = "ignore")]
size: OrderedFloat<f32>,
#[derivative(Hash="ignore", PartialEq = "ignore", PartialOrd = "ignore")]
orders: Vec<Order>,
}
一个reproducible example表示只有Ord
不正确。
任何时候实施 Ord
和 PartialOrd
,您都需要确保实施一致。使用 #[derive]
这是自动的,但是因为 derivative
允许您跳过字段,所以也可以得到彼此不一致的 Ord
和 PartialOrd
。在此代码中,它们都具有相同的 "ignore"
注释是有意义的。
#[derivative(Hash="ignore", PartialEq = "ignore", PartialOrd = "ignore", Ord = "ignore")]
// ^^^^^^^^^^^^^^
Ord
和 PartialOrd
的关系不同于 Eq
和 PartialEq
。 Eq
是一个标记特征——它没有自己的行为,只有关于 PartialEq
行为的契约。 Ord
,另一方面,携带 关于 PartialOrd
行为的承诺(即 partial_cmp
总是 returns Some
) 和它自己的行为(returns直接Ordering
的函数)。这就是为什么 Eq
不需要 "ignore"
注释但 Ord
.
需要注释的原因
我有以下数据结构。当我对其进行二进制搜索并传入 &limit_price
时,它仅在 size
和 orders
中的值也匹配时才匹配。因为我忽略了 PartialEq
,所以我认为它应该只匹配 price
字段。
我是不是漏掉了什么?
#[derive(Derivative)]
#[derivative(Hash, PartialEq, Eq, PartialOrd, Ord, Debug)]
struct LimitPrice {
price: OrderedFloat<f32>,
#[derivative(Hash="ignore", PartialEq = "ignore", PartialOrd = "ignore")]
size: OrderedFloat<f32>,
#[derivative(Hash="ignore", PartialEq = "ignore", PartialOrd = "ignore")]
orders: Vec<Order>,
}
一个reproducible example表示只有Ord
不正确。
任何时候实施 Ord
和 PartialOrd
,您都需要确保实施一致。使用 #[derive]
这是自动的,但是因为 derivative
允许您跳过字段,所以也可以得到彼此不一致的 Ord
和 PartialOrd
。在此代码中,它们都具有相同的 "ignore"
注释是有意义的。
#[derivative(Hash="ignore", PartialEq = "ignore", PartialOrd = "ignore", Ord = "ignore")]
// ^^^^^^^^^^^^^^
Ord
和 PartialOrd
的关系不同于 Eq
和 PartialEq
。 Eq
是一个标记特征——它没有自己的行为,只有关于 PartialEq
行为的契约。 Ord
,另一方面,携带 关于 PartialOrd
行为的承诺(即 partial_cmp
总是 returns Some
) 和它自己的行为(returns直接Ordering
的函数)。这就是为什么 Eq
不需要 "ignore"
注释但 Ord
.