Menu
Coddy logo textTech

Passando Funções como Argumentos

Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 45 de 65.

Na programação, as funções podem fazer mais do que apenas aceitar valores simples como números ou strings - elas também podem aceitar outras funções como parâmetros. Este conceito poderoso é chamado de função de ordem superior, e abre caminhos inteiramente novos para escrever código flexível e reutilizável.

Quando você passa uma função como um argumento, você está essencialmente dando a outra função a capacidade de decidir qual operação realizar. Pense nisso como dar uma ferramenta a alguém e deixá-la escolher como usá-la em diferentes materiais.

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

Neste exemplo, processNumbers recebe uma lista e uma função como parâmetros. O parâmetro de função operation pode ser qualquer função que aceite um número inteiro. Isso significa que você pode passar uma função que imprime números, os dobra ou realiza qualquer outra operação que você precise.

Essa abordagem torna seu código incrivelmente flexível – em vez de escrever funções separadas para cada operação possível, você escreve uma função que pode trabalhar com muitas operações diferentes, aceitando-as como parâmetros.

challenge icon

Desafio

Fácil

Crie um programa que demonstre a passagem de funções como argumentos ao construir um processador de números flexível. Seu programa criará diferentes funções de processamento e as passará para uma função processadora principal que aplica a operação a uma lista de números.

  1. Leia uma entrada de string contendo números separados por vírgulas (ex: "1,2,3,4,5")
  2. Leia uma entrada de string representando o tipo de operação ("double", "square", ou "increment")
  3. Divida a primeira entrada em uma lista de strings e converta cada uma para um número inteiro
  4. Crie três funções separadas:
    • doubleNumber - recebe um número inteiro e o retorna multiplicado por 2
    • squareNumber - recebe um número inteiro e o retorna multiplicado por ele mesmo
    • incrementNumber - recebe um número inteiro e o retorna somado a 1
  5. Crie uma função principal chamada processNumbers que recebe uma lista de inteiros e uma função como parâmetros
  6. A função processNumbers deve aplicar a função fornecida a cada número na lista e retornar uma nova lista com os resultados
  7. Com base na entrada do tipo de operação, passe a função apropriada para processNumbers
  8. Exiba os resultados no formato exato mostrado abaixo

Por exemplo, se as entradas forem "2,4,6,8" e "double", seu programa deve exibir:

Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfully

Se as entradas forem "3,5,7" e "square", seu programa deve exibir:

Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfully

Se as entradas forem "10,20,30" e "increment", seu programa deve exibir:

Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfully

Seu programa deve demonstrar o conceito de funções de ordem superior ao passar uma das três funções de operação como argumento para a função processNumbers. Use declarações condicionais para determinar qual função passar com base na entrada do tipo de operação. A função processNumbers deve iterar pela lista de entrada, aplicar a função fornecida a cada elemento e coletar os resultados em uma nova lista.

Folha de consulta

Funções de ordem superior são funções que podem aceitar outras funções como parâmetros, permitindo um código flexível e reutilizável.

Para passar uma função como argumento, defina um parâmetro do tipo Function:

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

Isso permite que você passe diferentes funções para realizar várias operações nos mesmos dados, tornando seu código mais modular e evitando a necessidade de escrever funções separadas para cada operação possível.

Experimente você mesmo

import 'dart:io';

void main() {
  // Ler entrada
  String? numbersInput = stdin.readLineSync();
  String? operation = stdin.readLineSync();
  
  // Converter entrada de string para lista de inteiros
  List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
  
  // TODO: Criar as três funções de operação (doubleNumber, squareNumber, incrementNumber)
  
  // TODO: Criar a função processNumbers que recebe uma lista e uma função como parâmetros
  
  // TODO: Usar estruturas condicionais para determinar qual função passar com base no tipo de operação
  
  // TODO: Chamar processNumbers com a função apropriada e armazenar o resultado
  
  // Exibir os resultados no formato exigido
  print('Number Processor');
  print('================');
  print('Original numbers: $numbers');
  print('Operation: $operation');
  print('Processing numbers...');
  // TODO: Imprimir a lista de resultados aqui
  print('Operation 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