Инвертирование порядка сортировки в Rust
Rust позволяет легко сортировать элементы по ключу с помощью .sort_by_key
, в примере ниже важные заметки будут помещены в конец:
struct Note {
imp: bool,
title: &'static str,
}
let mut notes = vec![
// ...
];
notes.sort_by_key(|k| k.imp);
Но инвертирование порядка сортировки с помощью ключа может быть не так очевидно, оно достигается с помощью вспомогательной структуры Reverse
, вот как ее можно применить к приведенному выше примеру, чтобы важные заметки были в начале:
use std::cmp::Reverse;
// ...
notes.sort_by_key(|k| Reverse(k.imp));
Как это реализовано? Давайте взглянем на исходный код стандартной библиотеки Rust:
pub struct Reverse<T>(pub T);
impl<T: Ord> Ord for Reverse<T> {
fn cmp(&self, other: &Reverse<T>) -> Ordering {
other.0.cmp(&self.0)
}
}
Все просто - это тип обертка (newtype) для исходного типа, и для типов с трейтом Ord
она переопределяет Ord
, но вместо сравнения self
с other
она сравнивает other
с self
, что означает - порядок в результате меняется на обратный. Просто и красиво!