Noções Básicas de Closures
7 exemplos - 5 básicos, 2 intermediários - para closures e captura.
Pré-requisitos
Exemplos Básicos
1. Sintaxe de Closure
fn main() {
let add = |a: i32, b: i32| a + b;
println!("{}", add(2, 3));
}- Tipos de parâmetros opcionais quando inferíveis
- O corpo pode ser uma expressão ou um bloco
2. Captura por Referência
fn main() {
let factor = 2;
let scale = |x| x * factor;
println!("{}", scale(5));
}- O closure empresta
factorimutavelmente - Traço
Fninferido
3. Closure move
use std::thread;
fn main() {
let msg = String::from("hi");
thread::spawn(move || println!("{msg}"));
}moveforça a captura por valor para dentro do closure
4. Com Iterador
fn main() {
let v: Vec<_> = (0..5).map(|n| n * 2).collect();
println!("{:?}", v);
}5. Inferência de Tipo
fn apply(f: impl Fn(i32) -> i32, x: i32) -> i32 { f(x) }Relacionado: Fn, FnMut & FnOnce
Exemplos Intermediários
6. Captura Mutável
fn main() {
let mut count = 0;
let mut inc = || { count += 1; };
inc();
println!("{count}");
}7. Prévia de Retorno de Closures
fn make_adder(n: i32) -> impl Fn(i32) -> i32 {
move |x| x + n
}Relacionado: Melhores Práticas de Closures
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+.