Funções de Ordem Superior
Funções que aceitam funções (closures) como argumentos ou as retornam permitem composição e padrões de controle reutilizáveis.
Receita
fn twice<F: Fn(i32) -> i32>(f: F, x: i32) -> i32 {
f(f(x))
}
fn main() {
println!("{}", twice(|n| n + 1, 0));
}Quando usar isso: Utilitários no estilo map/filter, middleware e iteração customizada.
Exemplo de Trabalho
fn retry<F: FnMut() -> bool>(mut f: F, max: u32) -> bool {
for _ in 0..max {
if f() { return true; }
}
false
}
fn main() {
let mut attempts = 0;
let ok = retry(|| { attempts += 1; attempts >= 3 }, 5);
println!("{ok} {attempts}");
}O que isso demonstra:
FnMutpara o contador de tentativas mutável na closure- Fluxo de controle de ordem superior (retry)
- Closures como parâmetro de estratégia
Análise Detalhada
Adaptadores de iterador são de ordem superior: map, filter aceitam closures. Componha pequenas HOFs para clareza.
Armadilhas
- Abstração excessiva de HOFs - Difícil de ler. Correção: Nomeie as operações claramente.
- Limite
FnvsFnMutmuito restrito - Falhas de compilação. Correção: Relaxe paraFnMutse necessário. - Profundidade de recursão - HOF chamando a si mesma via closure - limites de pilha.
- Alocação na closure retornada - Custo oculto em HOFs de fábrica.
- Testando HOFs - Passe closures simples ou mocks de funções.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Callback de objeto de trait | Plugins em tempo de execução | Genéricos estáticos funcionam |
Loop for inline | Tarefa única simples | Padrão reutilizado |
| Adaptadores de iterador | Transformações de coleção | Retry imperativo |
FAQs
hof vs método?
Função livre aceitando closure vs método em struct.compor?
Manual |f(g(x))| ou itertools.currying?
Não nativo - closures `move |y| x + y`.aplicação parcial?
Closure fixando argumentos.hof assíncrono?
Genérico sobre closures assíncronas em evolução.desempenho?
Monomorfizado - geralmente inlined.no_std?
Mesmos padrões em core.test doubles?
Passe closure registrando chamadas.middleware axum?
Layers são transformações de serviço de ordem superior.iterator fold?
HOF reduzindo coleção.Relacionados
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.