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
basepor empréstimo imutável. - A função
aplicardeve aceitarimpl 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
- Definimos a função
aplicarque recebe uma closurefque implementaFn(i32) -> i32e um valorx. - Dentro de
main, criamos a variávelbasecom valor 10. - Criamos a closure
somar_baseque capturabasepor empréstimo imutável e soma ao argumento. - Chamamos
aplicarpassandosomar_basee o valor 5. - A função
aplicarchama a closure com 5, retornando 15. - 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
basecomomutse a closure a modificar: isso causaria erro de compilação, poisFnMutrequer mutabilidade. - Tentar usar
movesem necessidade: a closure ainda funcionaria, mas moveriabasedesnecessariamente. - 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