Rust · Intermediário · Português · Técnico
traits de closure
Os traits Fn, FnMut e FnOnce, que dizem como uma closure usa o que capturou: só lendo, alterando ou consumindo. O compilador escolhe o mais permissivo possível.
Onde usar
Aparecem em bounds como F: FnMut() e em erros como 'expected a closure that implements Fn, but this closure only implements FnOnce'. Qualquer Fn serve onde se pede FnMut ou FnOnce, mas não o contrário.
Em código
fn chama<F: FnMut()>(mut f: F) {
f();
f();
}
let mut n = 0;
chama(|| n += 1);
println!("{n}");Exemplos
Esse parâmetro pede FnMut, então a closure pode alterar o contador.
A closure consome o valor, então só é FnOnce.
Cuidado
O trait depende de como o corpo usa as variáveis capturadas, não de a closure ter move: uma closure move que só lê o valor ainda é Fn.
Sinônimos
Fn, FnMut, FnOnce