typestar

Guardar closures en Rust

Un closure tiene un tipo innombrable; un struct lo guarda en un Box tras Fn.

struct Rule {
    name: &'static str,
    test: Box<dyn Fn(&str) -> bool>,
}

fn main() {
    let min_len = 4;
    let rules = vec![
        Rule {
            name: "long enough",
            test: Box::new(move |s: &str| s.len() >= min_len),
        },
        Rule {
            name: "lower case",
            test: Box::new(|s: &str| s.chars().all(|c| !c.is_uppercase())),
        },
    ];

    for candidate in ["rust", "Go"] {
        for rule in &rules {
            println!("{candidate} {}: {}", rule.name, (rule.test)(candidate));
        }
    }
}

Cómo funciona

  1. Box<dyn Fn(..) -> ..> le da al campo un tipo nombrable.
  2. FnMut es el bound cuando el closure muta sus capturas.
  3. Los genéricos evitan el Box cuando basta un tipo por struct.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
24
Caracteres a escribir
424
Tokens
159
Ritmo de tres estrellas
110 tpm

Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 87 segundos.

Escribe este fragmento

Paso 1 de 1 en Comportamiento guardado; paso 10 de 11 en Lifetimes y mutabilidad interior.

← Anterior Siguiente →