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

  1. Patrones Literales: Coinciden con valores específicos.
  2. Patrones de Variables: Coinciden con cualquier valor y lo asignan a una variable.
  3. Patrones de Constructor: Coinciden con objetos creados por constructores.
  4. Patrones de Tupla: Coinciden con tuplas.
  5. Patrones de Lista: Coinciden con listas y sus elementos.
  6. Patrones de Tipo: Coinciden con tipos específicos.
  7. 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.

© Copyright 2024. Todos los derechos reservados