Menu
Coddy logo textTech

Patrones y coincidencia (3.0)

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 87 de 110.

Dart 3 introdujo la coincidencia de patrones, una forma eficaz de desestructurar e inspeccionar datos en una sola expresión. Los patrones te permiten extraer valores de objetos, comprobar su estructura y vincular variables, todo a la vez.

Ya has visto la desestructuración básica con registros. Los patrones amplían esto para trabajar con objetos, listas y mapas:

void main() {
  // Patrones de lista
  var numbers = [1, 2, 3];
  var [a, b, c] = numbers;
  print('$a, $b, $c');  // 1, 2, 3
  
  // Patrones de mapa
  var user = {'name': 'Alice', 'age': 30};
  var {'name': name, 'age': age} = user;
  print('$name is $age');  // Alice is 30
}

Los patrones se vuelven especialmente potentes en las expresiones switch. Puedes hacer coincidencias simultáneamente por tipo, valor y estructura:

String describe(Object obj) {
  return switch (obj) {
    int n when n < 0 => 'Negative number',
    int n => 'Positive number: $n',
    String s => 'String of length ${s.length}',
    [int first, ...] => 'List starting with $first',
    _ => 'Something else',
  };
}

void main() {
  print(describe(-5));        // Número negativo
  print(describe(42));        // Número positivo: 42
  print(describe([1, 2, 3])); // List starting with 1
}

La cláusula when añade condiciones a los patrones, y ... coincide con los elementos restantes en una list. El guion bajo _ actúa como un comodín que coincide con cualquier cosa. Combinados con clases selladas, los patrones permiten un manejo exhaustivo y seguro en cuanto a tipos de estructuras de datos complejas.

challenge icon

Desafío

Fácil

¡Construyamos un classifier de data que use la coincidencia de patrones para analizar y categorizar distintos tipos de input! Crearás un sistema que pueda identificar y describe diversas estructuras de data usando las potentes funciones de coincidencia de patrones de Dart 3.

Organizarás tu código en dos archivos:

  • classifier.dart: Crea una function llamada classify que reciba un parámetro Object y devuelva una descripción String. Usa una expresión switch con coincidencia de patrones para gestionar estos casos:
    • Un list empty [] debe devolver Empty list
    • Un list con exactly un elemento integer debe devolver Single item: [value]
    • Un list con exactly dos elements debe devolver Pair: [first] and [second]
    • Un list que comienza con un integer seguido de más elements debe devolver List starting with [first], length: [total length] (usa el rest pattern ...)
    • Un map que contenga both las keys 'name' y 'age' debe devolver [name] is [age] years old (usa la destructuración de patrones de map)
    • Un integer que sea negativo (usa la cláusula when) debe devolver Negative: [value]
    • Un integer que sea cero debe devolver Zero
    • Cualquier otro integer debe devolver Positive: [value]
    • Cualquier otro valor debe devolver Unknown type
  • main.dart: Importa tu classifier y demuestra la coincidencia de patrones con varios inputs. Imprime el resultado de clasificar cada uno de estos valores:
    • Un list empty []
    • Un list con un element: [42]
    • Un list con dos elements: ['hello', 'world']
    • Un list longer: [1, 2, 3, 4, 5]
    • Un map: {'name': 'Alice', 'age': 25}
    • El integer -10
    • El integer 0
    • El integer 99

Este desafío combina los patrones de list, los patrones de map, la cláusula when para las guardas y el rest pattern (...) - ¡todas las funciones clave de coincidencia de patrones de la lección!

Salida esperada:

Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99

Pruébalo tú mismo

import 'classifier.dart';

void main() {
  // TODO: Usa la función classify para categorizar cada valor
  // e imprime los resultados
  
  // Prueba con una lista vacía
  print(classify([]));
  
  // TODO: Prueba con una lista que contenga un elemento: [42]
  
  // TODO: Prueba con una lista que contenga dos elementos: ['hello', 'world']
  
  // TODO: Prueba con una lista más larga: [1, 2, 3, 4, 5]
  
  // TODO: Prueba con un map: {'name': 'Alice', 'age': 25}
  
  // TODO: Prueba con el entero -10
  
  // TODO: Prueba con el entero 0
  
  // TODO: Prueba con el entero 99
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online