导数不忽略比较字段

Derivative not ignoring fields for comparison

我有以下数据结构。当我对其进行二进制搜索并传入 &limit_price 时,它仅在 sizeorders 中的值也匹配时才匹配。因为我忽略了 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不正确。

任何时候实施 OrdPartialOrd,您都需要确保实施一致。使用 #[derive] 这是自动的,但是因为 derivative 允许您跳过字段,所以也可以得到彼此不一致的 OrdPartialOrd。在此代码中,它们都具有相同的 "ignore" 注释是有意义的。

#[derivative(Hash="ignore", PartialEq = "ignore", PartialOrd = "ignore", Ord = "ignore")]
                                                                      // ^^^^^^^^^^^^^^

(playground)

OrdPartialOrd 的关系不同于 EqPartialEqEq 是一个标记特征——它没有自己的行为,只有关于 PartialEq 行为的契约。 Ord,另一方面,携带 关于 PartialOrd 行为的承诺(即 partial_cmp 总是 returns Some) 它自己的行为(returns直接Ordering的函数)。这就是为什么 Eq 不需要 "ignore" 注释但 Ord.

需要注释的原因