Как реализовать черту Ord, не получая ошибку «использование нестабильной библиотечной функции« зажим »»? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть структура, которую я хочу использовать в качестве ключа в BTreeMap, поэтому я реализую PartialEq, Eq, PartialOrd и Ord. Последнее вызывает проблему, поскольку существует небезопасный метод clamp.

Я реализую его следующим образом:

use std::cmp::Ordering;

#[derive(Debug, Eq, Copy, Clone)]
struct Baz(usize);

impl PartialEq for Baz {
    fn eq(&self, other: &Self) -> bool {
        self.0.eq(&other.0)
    }

    fn ne(&self, other: &Self) -> bool {
        self.0.ne(&other.0)
    }
}

impl PartialOrd for Baz {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        self.0.partial_cmp(&other.0)
    }

    fn lt(&self, other: &Self) -> bool {
        self.0.lt(&other.0)
    }

    fn le(&self, other: &Self) -> bool {
        self.0.le(&other.0)
    }

    fn gt(&self, other: &Self) -> bool {
        self.0.gt(&other.0)
    }

    fn ge(&self, other: &Self) -> bool {
        self.0.ge(&other.0)
    }
}

impl Ord for Baz {
    fn cmp(&self, other: &Self) -> Ordering {
        self.0.cmp(&other.0)
    }

    fn max(self, other: Self) -> Self
    where
        Self: Sized,
    {
        Self(self.0.max(other.0))
    }

    fn min(self, other: Self) -> Self
    where
        Self: Sized,
    {
        Self(self.0.min(other.0))
    }

    fn clamp(self, min: Self, max: Self) -> Self
    where
        Self: Sized,
    {
        Self(self.0.clamp(min.0, max.0))
    }
}

fn main() {
    Baz(1);
}

Детская площадка

Насколько я знаю, зажим для целых чисел безопасен и должен работать просто отлично, но Rust выдает мне ошибку

error[E0658]: use of unstable library feature 'clamp'
  --> src/main.rs:57:5
   |
57 | /     fn clamp(self, min: Self, max: Self) -> Self
58 | |     where
59 | |         Self: Sized,
60 | |     {
61 | |         Self(self.0.clamp(min.0, max.0))
62 | |     }
   | |_____^
   |
   = note: for more information, see https://github.com/rust-lang/rust/issues/44095

error[E0658]: use of unstable library feature 'clamp'
  --> src/main.rs:61:21
   |
61 |         Self(self.0.clamp(min.0, max.0))
   |                     ^^^^^
   |
   = note: for more information, see https://github.com/rust-lang/rust/issues/44095

Как я могу решить эту проблему? Я использую Rust 1.41.

1 Ответ

1 голос
/ 09 марта 2020

Насколько я знаю, зажим для целых чисел безопасен и должен работать просто отлично, но Rust дает мне ошибку

Это потому что Ord::clamp метод нестабильный - компилятор не обманывает вас. Однако это метод с реализацией по умолчанию , поэтому вам не нужно его реализовывать (и не стоит, если вы не можете улучшить реализацию по умолчанию).

Полезно, что в документации есть раздел для Ord под названием Как я могу реализовать Ord? , который точно описывает, что вам нужно сделать:

Ord требует, чтобы тип также был PartialOrd и Eq (что требует PartialEq).

Затем необходимо определить реализацию для cmp(). Может оказаться полезным использовать cmp() в полях вашего типа.

Особое значение имеет тот факт, что Ord может быть получено:

Эта черта может использоваться с #[derive]. Когда derive d для структур, он создаст лексикографический порядок c, основанный на порядке объявления элементов структуры сверху вниз. Когда derive d для перечислений, варианты упорядочены по порядку объявления сверху вниз.

Весь ваш код может быть, вероятно,

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Copy, Clone)]
struct Baz(usize);

См. Также:

...