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 é 15Desafio
FácilVocê 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 é 15A 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);
}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
1Fluxo de Controle Avançado
A Expressão 'match'Correspondência de Múltiplos ValoresCorrespondência de IntervalosA Expressão 'if let'Loops como ExpressõesRecapitulação - Parser de Comandos Simples4Agrupando Dados com Structs
O que é uma Struct?Visão Geral de StructsAcessando Campos de uma StructStructs MutáveisStructs como Parâmetros de FunçãoTuple StructsRecapitulação - Criando uma Struct Book7Tratando Erros com 'Result'
O que é um 'Result'?Usando 'match' com 'Result'is_ok() e is_err()Atalhos: unwrap e expectO Operador de Interrogação '?'Parsing de Strings para NúmerosRecapitulação - Função de Divisão Segura10Closures & Funções Anônimas
O que é uma Closure?Definindo uma Closure SimplesClosures com ParâmetrosCapturando o AmbienteRecapitulação - Closure de Soma Simples2Introdução a Vetores
O que é um Vetor?Criando um VetorAdicionando Elementos com pushAcessando Elementos do VetorIterando sobre um VetorIteração MutávelRemovendo ElementosRecapitulação - Rastreador de Pontuação Básico5Pares Chave-Valor com Hash Maps
O que é um Hash Map?Criando um Hash MapInserindo Pares Chave-ValorAcessando ValoresIterando sobre um Hash MapAtualizando um ValorRemovendo um ParRecapitulação - Contador de Palavras8Projeto: Inventário Simples de Itens
Configuração do ProjetoAdicionando um ItemVerificando o EstoqueVendendo um ItemJuntando tudo3Lista de Tarefas via Linha de Comando
Configuração do ProjetoAdicionando uma TarefaVisualizando Todas as TarefasRemovendo uma TarefaCódigo Final