Menu
Coddy logo textTech

Entendendo Closures

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy. Lição 46 de 65.

Uma closure é um tipo especial de função que “se lembra” das variáveis do local onde foi criada, mesmo depois que esse contexto original terminou de ser executado. Pense nela como uma função que leva consigo um pedaço de seu local de origem aonde 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 depois que a função externa conclui 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 escopo ao seu redor. Mesmo depois que createGreeting termina de ser executada, a função retornada ainda se lembra de qual era o valor de name.

Closures são incrivelmente úteis para criar funções especializadas ou manter o estado de forma organizada. Elas permitem criar funções personalizadas com base no ambiente em que foram criadas, tornando seu código mais flexível e poderoso.

challenge icon

Desafio

Fácil

Crie um programa que demonstre closures construindo um sistema personalizado de geração de mensagens. Seu programa criará funções que "lembram" informações específicas e usam essas informações para gerar mensagens personalizadas mesmo depois que o contexto original tiver terminado.

  1. Leia uma entrada do tipo string que represente o nome de uma pessoa
  2. Leia uma entrada do tipo string que represente um tipo de saudação ("formal", "casual" ou "friendly")
  3. Leia uma entrada do tipo string que represente o nome de uma empresa
  4. Crie uma função chamada createMessageGenerator que receba um nome e um tipo de saudação como parâmetros
  5. A função createMessageGenerator deve retornar outra função (uma closure) que:
    • Receba um nome de empresa como parâmetro
    • Use o nome e o tipo de saudação do escopo da função externa
    • Retorne uma mensagem formatada com base 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]!"
  6. Chame a função createMessageGenerator com as entradas de nome e tipo de saudação para obter sua função closure
  7. Chame a função closure retornada com a entrada do nome da empresa para gerar a mensagem
  8. Exiba os resultados exatamente no formato mostrado abaixo

Por exemplo, se as entradas forem "Alice", "formal" e "TechCorp", seu programa deverá produzir:

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 successfully

Se as entradas forem "Bob", "casual" e "StartupXYZ", seu programa deverá produzir:

Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfully

Se as entradas forem "Carol", "friendly" e "InnovateLab", seu programa deverá produzir:

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 successfully

Seu 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 depois que a função externa tiver terminado sua execução. Use instruções condicionais para determinar o formato apropriado da mensagem com base na entrada do tipo de saudação.

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
  // Create the createMessageGenerator function that returns a closure
  // Chame a função e gere a mensagem
  
  // Exibir os resultados finais
  print("Generated message: \$message");
  print("Message generation completed successfully");
}
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 Lógica & Fluxo

Pratique por conta própria: Compilador de Dart online