Orden personalizado en Rust
Implementar Ord decide cómo se ordena tu tipo en todos los lugares donde se compara.
#[derive(Debug, PartialEq, Eq)]
struct Step {
stars: u8,
title: String,
}
impl Ord for Step {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
other
.stars
.cmp(&self.stars)
.then_with(|| self.title.cmp(&other.title))
}
}
impl PartialOrd for Step {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
fn main() {
let mut steps = vec![
Step { stars: 1, title: "Slices".to_string() },
Step { stars: 3, title: "Traits".to_string() },
Step { stars: 3, title: "Errors".to_string() },
];
steps.sort();
for s in &steps {
println!("{} {}", s.stars, s.title);
}
}
Cómo funciona
- Derivar
PartialOrdcompara los campos en orden de declaración. - Un
Ordescrito a mano elige la regla que quieres. sortentonces no necesita comparador en la llamada.
Palabras clave y builtins usados aquí
OptionOrdPartialOrdSomeStringfnforimplinletmutselfstructu8
El intento, en números
- Líneas
- 32
- Caracteres a escribir
- 602
- Tokens
- 198
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 113 segundos.
Paso 4 de 4 en Traits estándar; paso 11 de 19 en Traits y genéricos.