Entendendo Closures
Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 46 de 65.
Um closure é um tipo especial de função que "se lembra" de variáveis do local onde foi criada, mesmo após o contexto original ter terminado de ser executado. Pense nisso como uma função que carrega um pedaço de seu local de origem com ela por onde quer que vá.
Quando você cria uma função dentro de outra função, a função interna tem acesso às variáveis da função externa. O que torna isso um closure é que esse acesso persiste mesmo após a função externa ter concluído sua execução.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}Neste exemplo, a função anônima retornada por createGreeting é uma closure. Ela captura o parâmetro name do seu escopo envolvente. Mesmo após createGreeting terminar a execução, a função retornada ainda se lembra do que name era.
Closures são incrivelmente úteis para criar funções especializadas ou manter o estado de uma forma limpa. Eles permitem que você construa funções personalizadas com base no ambiente onde foram criadas, tornando seu código mais flexível e poderoso.
Desafio
FácilCrie um programa que demonstre closures construindo um sistema gerador de mensagens personalizadas. Seu programa criará funções que "lembram" informações específicas e usam essas informações para gerar mensagens customizadas mesmo após o contexto original ter sido finalizado.
- Leia uma entrada de string representando o nome de uma pessoa
- Leia uma entrada de string representando um tipo de saudação (
"formal","casual", ou"friendly") - Leia uma entrada de string representando o nome de uma empresa
- Crie uma função chamada
createMessageGeneratorque recebe um nome e um tipo de saudação como parâmetros - A função
createMessageGeneratordeve retornar outra função (uma closure) que: - Recebe o nome de uma empresa como seu parâmetro
- Usa o nome e o tipo de saudação do escopo da função externa
- Retorna uma mensagem formatada baseada no tipo de saudação:
- Para
"formal":"Dear [name], we are pleased to welcome you to [company]." - Para
"casual":"Hey [name]! Welcome to [company]!" - Para
"friendly":"Hi [name], so glad you joined [company]!" - Chame a função
createMessageGeneratorcom as entradas de nome e tipo de saudação para obter sua função closure - Chame a função closure retornada com a entrada do nome da empresa para gerar a mensagem
- Exiba os resultados no formato exato mostrado abaixo
Por exemplo, se as entradas forem "Alice", "formal", e "TechCorp", seu programa deve imprimir:
Message Generator System
========================
Creating message generator for: Alice
Greeting type: formal
Company: TechCorp
========================
Generated message: Dear Alice, we are pleased to welcome you to TechCorp.
Message generation completed successfullySe as entradas forem "Bob", "casual", e "StartupXYZ", seu programa deve imprimir:
Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfullySe as entradas forem "Carol", "friendly", e "InnovateLab", seu programa deve imprimir:
Message Generator System
========================
Creating message generator for: Carol
Greeting type: friendly
Company: InnovateLab
========================
Generated message: Hi Carol, so glad you joined InnovateLab!
Message generation completed successfullySeu programa deve demonstrar closures criando uma função que retorna outra função. A função retornada (closure) deve ter acesso às variáveis do escopo da função externa (nome e tipo de saudação) mesmo após a função externa ter terminado sua execução. Use estruturas condicionais para determinar o formato de mensagem apropriado com base na entrada do tipo de saudação.
Folha de consulta
Um closure é uma função que "lembra" variáveis do local onde foi criada, mesmo após o contexto original ter terminado de ser executado.
Quando você cria uma função dentro de outra função, a função interna tem acesso às variáveis da função externa. Esse acesso persiste mesmo após a função externa ter concluído sua execução.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}Neste exemplo, a função anônima retornada por createGreeting é um closure. Ela captura o parâmetro name de seu escopo circundante. Mesmo após createGreeting terminar de ser executada, a função retornada ainda lembra qual era o valor de name.
Closures são úteis para criar funções especializadas ou manter o estado de forma limpa. Eles permitem que você construa funções que são personalizadas com base no ambiente onde foram criadas.
Experimente você mesmo
import 'dart:io';
void main() {
// Ler entrada
String? name = stdin.readLineSync();
String? greetingType = stdin.readLineSync();
String? company = stdin.readLineSync();
// Exibir cabeçalho do sistema
print("Message Generator System");
print("========================");
print("Creating message generator for: $name");
print("Greeting type: $greetingType");
print("Company: $company");
print("========================");
// TODO: Escreva seu código abaixo
// Crie a função createMessageGenerator que retorna um closure
// Chame a função e gere a mensagem
// Exibir os resultados finais
print("Generated message: \$message");
print("Message generation completed successfully");
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados Únicos