typestar

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

  1. Derivar PartialOrd compara los campos en orden de declaración.
  2. Un Ord escrito a mano elige la regla que quieres.
  3. sort entonces no necesita comparador en la llamada.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 4 de 4 en Traits estándar; paso 11 de 19 en Traits y genéricos.

← Anterior Siguiente →