La coincidencia de patrones es una característica poderosa y expresiva de Scala que permite descomponer estructuras de datos complejas y realizar operaciones basadas en su forma. Es similar a un switch
en otros lenguajes, pero mucho más flexible y potente.
Conceptos Clave
- Patrones Literales: Coinciden con valores específicos.
- Patrones de Variables: Coinciden con cualquier valor y lo asignan a una variable.
- Patrones de Constructor: Coinciden con objetos creados por constructores.
- Patrones de Tupla: Coinciden con tuplas.
- Patrones de Lista: Coinciden con listas y sus elementos.
- Patrones de Tipo: Coinciden con tipos específicos.
- Patrones de Guardas: Añaden condiciones adicionales a los patrones.
Ejemplos Prácticos
Patrones Literales
val x: Any = 42 x match { case 1 => println("Uno") case 42 => println("Cuarenta y dos") case _ => println("Otro número") }
En este ejemplo, x
se compara con los valores literales 1
y 42
. Si x
es 42
, se imprime "Cuarenta y dos".
Patrones de Variables
val y: Any = "Scala" y match { case s: String => println(s"Es una cadena: $s") case _ => println("No es una cadena") }
Aquí, y
se compara con el tipo String
. Si y
es una cadena, se asigna a la variable s
y se imprime.
Patrones de Constructor
case class Person(name: String, age: Int) val person = Person("Alice", 25) person match { case Person(name, age) => println(s"Nombre: $name, Edad: $age") }
En este caso, person
se descompone en sus componentes name
y age
usando el patrón de constructor.
Patrones de Tupla
val tuple = (1, "Scala") tuple match { case (num, lang) => println(s"Número: $num, Lenguaje: $lang") }
Aquí, tuple
se descompone en sus elementos num
y lang
.
Patrones de Lista
val list = List(1, 2, 3) list match { case List(1, 2, 3) => println("Lista completa") case List(1, _*) => println("Lista que empieza con 1") case _ => println("Otra lista") }
En este ejemplo, list
se compara con diferentes patrones de lista.
Patrones de Tipo
val z: Any = 100 z match { case i: Int => println(s"Es un entero: $i") case s: String => println(s"Es una cadena: $s") case _ => println("Otro tipo") }
Aquí, z
se compara con diferentes tipos.
Patrones de Guardas
val number = 10 number match { case n if n % 2 == 0 => println(s"$n es par") case n if n % 2 != 0 => println(s"$n es impar") }
En este caso, se añaden condiciones adicionales a los patrones.
Ejercicio Práctico
Ejercicio 1
Escribe una función que tome una lista de enteros y use la coincidencia de patrones para devolver una cadena que describa la lista.
def describeList(lst: List[Int]): String = { lst match { case Nil => "La lista está vacía" case List(single) => s"La lista tiene un solo elemento: $single" case List(first, second) => s"La lista tiene dos elementos: $first y $second" case _ => "La lista tiene más de dos elementos" } }
Solución
def describeList(lst: List[Int]): String = { lst match { case Nil => "La lista está vacía" case List(single) => s"La lista tiene un solo elemento: $single" case List(first, second) => s"La lista tiene dos elementos: $first y $second" case _ => "La lista tiene más de dos elementos" } } // Pruebas println(describeList(Nil)) // La lista está vacía println(describeList(List(1))) // La lista tiene un solo elemento: 1 println(describeList(List(1, 2))) // La lista tiene dos elementos: 1 y 2 println(describeList(List(1, 2, 3))) // La lista tiene más de dos elementos
Resumen
En esta sección, hemos explorado la coincidencia de patrones en Scala, una característica poderosa que permite descomponer y analizar estructuras de datos de manera concisa y expresiva. Hemos cubierto varios tipos de patrones, incluyendo literales, variables, constructores, tuplas, listas, tipos y guardas. Además, hemos proporcionado ejemplos prácticos y un ejercicio para reforzar los conceptos aprendidos.
En la siguiente sección, profundizaremos en la Programación Orientada a Objetos en Scala, donde aprenderemos sobre clases, objetos, herencia y más.
Curso de Programación en Scala
Módulo 1: Introducción a Scala
- Introducción a Scala
- Configuración del Entorno de Desarrollo
- Conceptos Básicos de Scala: Sintaxis y Estructura
- Variables y Tipos de Datos
- Operaciones Básicas y Expresiones
Módulo 2: Estructuras de Control y Funciones
- Sentencias Condicionales
- Bucles e Iteraciones
- Funciones y Métodos
- Funciones de Orden Superior
- Funciones Anónimas
Módulo 3: Colecciones y Estructuras de Datos
- Introducción a las Colecciones
- Listas y Arreglos
- Conjuntos y Mapas
- Tuplas y Opciones
- Coincidencia de Patrones
Módulo 4: Programación Orientada a Objetos en Scala
- Clases y Objetos
- Herencia y Rasgos
- Clases Abstractas y Clases Caso
- Objetos Compañeros
- Objetos Singleton
Módulo 5: Programación Funcional en Scala
- Inmutabilidad y Funciones Puras
- Estructuras de Datos Funcionales
- Mónadas y Funtores
- Comprensiones For
- Manejo de Errores en Programación Funcional
Módulo 6: Conceptos Avanzados de Scala
- Conversiones y Parámetros Implícitos
- Clases de Tipo y Polimorfismo
- Macros y Reflexión
- Concurrencia en Scala
- Introducción a Akka