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
Box<dyn Fn(..) -> ..>le da al campo un tipo nombrable.FnMutes el bound cuando el closure muta sus capturas.- Los genéricos evitan el Box cuando basta un tipo por struct.
Palabras clave y builtins usados aquí
BoxFnbooldynfnforinletmovestaticstrstruct
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.
Paso 1 de 1 en Comportamiento guardado; paso 10 de 11 en Lifetimes y mutabilidad interior.