Menu
Coddy logo textTech

Capturando o Ambiente

Parte da seção Logic & Flow do Journey de Rust da Coddy — lição 62 de 66.

Uma das características mais poderosas das closures é a sua capacidade de capturar e usar variáveis de seu ambiente circundante. Ao contrário de funções regulares, as closures podem "ver" e acessar variáveis que existem no mesmo escopo onde foram definidas.

Veja como a captura de ambiente funciona:

fn main() {
    let x = 10;
    
    let my_closure = || {
        println!("The value of x is: {}", x);
    };
    
    my_closure(); // Isso imprimirá "The value of x is: 10"
}

Neste exemplo, o closure captura a variável x do escopo circundante e a utiliza dentro de seu corpo. O closure não precisa que x seja passado como um parâmetro - ele tem acesso a ela automaticamente.

Você também pode capturar variáveis e usá-las em cálculos:

let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // o resultado é 15
challenge icon

Desafio

Fácil

Você receberá duas entradas. A primeira entrada é um número que representa um preço base. A segunda entrada é um número que representa uma porcentagem de desconto. Crie uma closure que capture a porcentagem de desconto do ambiente e calcule o preço final após a aplicação do desconto. Chame a closure com o preço base e imprima o preço final.

Requisitos:

  • Leia a primeira entrada (preço base) e remova os espaços em branco
  • Converta-a para f64
  • Leia a segunda entrada (porcentagem de desconto) e remova os espaços em branco
  • Converta-a para f64
  • Crie uma closure que receba um parâmetro (o preço base) e capture a porcentagem de desconto do ambiente circundante
  • A closure deve calcular o preço final usando a fórmula: base_price - (base_price * discount / 100.0)
  • Chame a closure com o preço base
  • Imprima o preço final

Entrada:

  • Primeira linha: Um preço base (ex: 100.0)
  • Segunda linha: Uma porcentagem de desconto (ex: 20.0)

Saída:

  • O preço final após a aplicação do desconto

Folha de consulta

Closures podem capturar e usar variáveis de seu ambiente circundante sem precisar delas como parâmetros.

Captura básica de ambiente:

let x = 10;

let my_closure = || {
    println!("The value of x is: {}", x);
};

my_closure(); // Imprime "The value of x is: 10"

Capturando variáveis em cálculos:

let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // result é 15

A closure captura automaticamente multiplier do escopo circundante e o utiliza no cálculo.

Experimente você mesmo

use std::io;

fn main() {
    // Ler o preço base
    let mut base_price_input = String::new();
    io::stdin().read_line(&mut base_price_input).expect("Failed to read line");
    let base_price: f64 = base_price_input.trim().parse().expect("Invalid number");
    
    // Ler a porcentagem de desconto
    let mut discount_input = String::new();
    io::stdin().read_line(&mut discount_input).expect("Failed to read line");
    let discount: f64 = discount_input.trim().parse().expect("Invalid number");
    
    // TODO: Criar uma closure que captura o desconto e calcula o preço final
    // TODO: Chamar a closure com o preço base
    
    // Imprimir o preço final
    // println!("{}", final_price);
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Logic & Flow