Las funciones son bloques de código que realizan una tarea específica y pueden ser reutilizadas en diferentes partes de un programa. En Dart, las funciones son ciudadanos de primera clase, lo que significa que pueden ser asignadas a variables, pasadas como argumentos a otras funciones y devueltas por otras funciones.

Conceptos Clave

  1. Definición de Funciones: Cómo declarar y definir funciones en Dart.
  2. Parámetros de Función: Diferentes tipos de parámetros que se pueden usar en las funciones.
  3. Valores de Retorno: Cómo devolver valores desde una función.
  4. Funciones Anónimas y Lambdas: Uso de funciones sin nombre.
  5. Closures: Funciones que capturan el entorno en el que fueron creadas.

Definición de Funciones

Para definir una función en Dart, se utiliza la palabra clave void si la función no devuelve ningún valor, o se especifica el tipo de dato que la función devolverá.

void main() {
  // Llamada a la función
  greet();
}

// Definición de una función que no devuelve valor
void greet() {
  print('Hello, World!');
}

Si la función devuelve un valor, se especifica el tipo de retorno:

void main() {
  // Llamada a la función
  int result = add(3, 4);
  print(result); // Imprime: 7
}

// Definición de una función que devuelve un valor
int add(int a, int b) {
  return a + b;
}

Parámetros de Función

Parámetros Posicionales

Son los parámetros que se pasan en el orden en que se definen.

void main() {
  printFullName('John', 'Doe');
}

void printFullName(String firstName, String lastName) {
  print('$firstName $lastName');
}

Parámetros Nombrados

Permiten especificar los argumentos por nombre, lo que mejora la legibilidad del código.

void main() {
  printFullName(firstName: 'John', lastName: 'Doe');
}

void printFullName({required String firstName, required String lastName}) {
  print('$firstName $lastName');
}

Parámetros Opcionales

Pueden ser posicionales o nombrados y no son obligatorios al llamar a la función.

void main() {
  printFullName('John');
}

void printFullName(String firstName, [String? lastName]) {
  if (lastName != null) {
    print('$firstName $lastName');
  } else {
    print(firstName);
  }
}

Valores de Retorno

Las funciones pueden devolver valores utilizando la palabra clave return.

void main() {
  int result = multiply(3, 4);
  print(result); // Imprime: 12
}

int multiply(int a, int b) {
  return a * b;
}

Funciones Anónimas y Lambdas

Las funciones anónimas, también conocidas como lambdas o funciones de flecha, son funciones sin nombre que se pueden asignar a variables o pasar como argumentos.

Función Anónima

void main() {
  var list = ['apples', 'bananas', 'oranges'];
  list.forEach((item) {
    print(item);
  });
}

Función de Flecha

void main() {
  var list = ['apples', 'bananas', 'oranges'];
  list.forEach((item) => print(item));
}

Closures

Un closure es una función que captura las variables del entorno en el que fue creada.

void main() {
  Function addTo = makeAdder(2);
  print(addTo(3)); // Imprime: 5
}

Function makeAdder(int addBy) {
  return (int i) => addBy + i;
}

Ejercicios Prácticos

Ejercicio 1: Crear una Función de Suma

Instrucciones: Escribe una función llamada sum que tome dos números como parámetros y devuelva su suma.

int sum(int a, int b) {
  return a + b;
}

void main() {
  print(sum(5, 3)); // Debería imprimir: 8
}

Ejercicio 2: Función con Parámetros Nombrados

Instrucciones: Escribe una función llamada describePerson que tome parámetros nombrados name y age, y que imprima una descripción de la persona.

void describePerson({required String name, required int age}) {
  print('$name is $age years old.');
}

void main() {
  describePerson(name: 'Alice', age: 30); // Debería imprimir: Alice is 30 years old.
}

Ejercicio 3: Función Anónima

Instrucciones: Usa una función anónima para imprimir cada elemento de una lista.

void main() {
  var fruits = ['apple', 'banana', 'cherry'];
  fruits.forEach((fruit) {
    print(fruit);
  });
}

Soluciones

Solución al Ejercicio 1

int sum(int a, int b) {
  return a + b;
}

void main() {
  print(sum(5, 3)); // Imprime: 8
}

Solución al Ejercicio 2

void describePerson({required String name, required int age}) {
  print('$name is $age years old.');
}

void main() {
  describePerson(name: 'Alice', age: 30); // Imprime: Alice is 30 years old.
}

Solución al Ejercicio 3

void main() {
  var fruits = ['apple', 'banana', 'cherry'];
  fruits.forEach((fruit) {
    print(fruit);
  });
}

Conclusión

En esta sección, hemos aprendido cómo definir y utilizar funciones en Dart, incluyendo el uso de parámetros posicionales, nombrados y opcionales. También hemos explorado funciones anónimas y closures. Las funciones son una herramienta poderosa para estructurar y reutilizar código, y comprender su uso es fundamental para cualquier programador de Dart. En el próximo módulo, profundizaremos en las colecciones, como listas, conjuntos y mapas, que son esenciales para manejar grupos de datos en Dart.

© Copyright 2024. Todos los derechos reservados