Инвертирование порядка сортировки в 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, что означает - порядок в результате меняется на обратный. Просто и красиво!