Fácil Rust

Closure que soma um valor fixo

Enunciado

Crie uma closure que captura uma variável base e retorna a soma de base com um argumento. Depois, use a função aplicar para chamar essa closure com o valor 5 e imprima o resultado.

Requisitos

  • A closure deve capturar base por empréstimo imutável.
  • A função aplicar deve aceitar impl Fn(i32) -> i32.
  • O programa deve imprimir o resultado da soma.

Código inicial

fn aplicar<F: Fn(i32) -> i32>(f: F, x: i32) -> i32 {
    f(x)
}

fn main() {
    let base = 10;
    // Complete aqui: crie a closure e chame aplicar
}

Saída esperada

15
Ver dica

A closure pode ser |x| x + base. Passe-a para aplicar junto com o valor 5.

Mostrar solução
fn aplicar<F: Fn(i32) -> i32>(f: F, x: i32) -> i32 {
    f(x)
}

fn main() {
    let base = 10;
    // Closure que captura base por empréstimo imutável
    let somar_base = |x| x + base;
    let resultado = aplicar(somar_base, 5);
    println!("{}", resultado);
}

Passo a passo

  1. Definimos a função aplicar que recebe uma closure f que implementa Fn(i32) -> i32 e um valor x.
  2. Dentro de main, criamos a variável base com valor 10.
  3. Criamos a closure somar_base que captura base por empréstimo imutável e soma ao argumento.
  4. Chamamos aplicar passando somar_base e o valor 5.
  5. A função aplicar chama a closure com 5, retornando 15.
  6. Imprimimos o resultado.

Por que funciona

A closure somar_base captura base por referência imutável, pois apenas lê o valor. Isso satisfaz a trait Fn, que permite chamadas múltiplas sem modificar o ambiente. A função aplicar é genérica sobre F: Fn(i32) -> i32, aceitando qualquer closure que se comporte como uma função pura.

Erros comuns

  • Esquecer de declarar base como mut se a closure a modificar: isso causaria erro de compilação, pois FnMut requer mutabilidade.
  • Tentar usar move sem necessidade: a closure ainda funcionaria, mas moveria base desnecessariamente.
  • Passar a closure sem os parênteses: aplicar(somar_base, 5) está correto; aplicar(somar_base(), 5) tentaria chamar a closure antes de passar.

Outra forma de resolver

Poderia usar uma função anônima diretamente: aplicar(|x| x + base, 5). É mais conciso quando a closure é usada uma única vez.

Saída esperada

15