La coincidència de patrons (pattern matching) és una característica poderosa i versàtil de Scala que permet descompondre estructures de dades complexes de manera clara i concisa. És similar a un switch en altres llenguatges de programació, però molt més potent i flexible.
Conceptes Clau
- Sintaxi Bàsica: La coincidència de patrons es realitza amb l'expressió
matchseguida de casos (case). - Patrons: Els patrons poden ser literals, variables, constructors, tuples, llistes, etc.
- Guardes: Condicions addicionals que es poden afegir als patrons per refinar la coincidència.
- Coincidència Exhaustiva: Assegurar-se que tots els casos possibles estan coberts.
Sintaxi Bàsica
La sintaxi bàsica de la coincidència de patrons és la següent:
Exemple Bàsic
val x: Any = 5
val result = x match {
case 1 => "one"
case 2 => "two"
case 3 => "three"
case _ => "other"
}
println(result) // Output: otherPatrons Comuns
Literals
val x: Any = "hello"
val result = x match {
case "hello" => "greeting"
case "goodbye" => "farewell"
case _ => "unknown"
}
println(result) // Output: greetingVariables
val x: Any = 42
val result = x match {
case i: Int => s"integer: $i"
case s: String => s"string: $s"
case _ => "other"
}
println(result) // Output: integer: 42Constructors
sealed trait Animal
case class Dog(name: String) extends Animal
case class Cat(name: String) extends Animal
val pet: Animal = Dog("Rex")
val result = pet match {
case Dog(name) => s"Dog named $name"
case Cat(name) => s"Cat named $name"
}
println(result) // Output: Dog named RexTuples
val pair = (1, "one")
val result = pair match {
case (1, "one") => "matched"
case _ => "not matched"
}
println(result) // Output: matchedLlistes
val list = List(1, 2, 3)
val result = list match {
case List(1, 2, 3) => "matched"
case _ => "not matched"
}
println(result) // Output: matchedGuardes
Les guardes són condicions addicionals que es poden afegir als patrons per refinar la coincidència.
val x: Int = 5
val result = x match {
case i if i > 0 => "positive"
case i if i < 0 => "negative"
case _ => "zero"
}
println(result) // Output: positiveCoincidència Exhaustiva
És important assegurar-se que tots els casos possibles estan coberts per evitar errors en temps d'execució.
sealed trait Option[+A]
case class Some[A](value: A) extends Option[A]
case object None extends Option[Nothing]
val option: Option[Int] = Some(5)
val result = option match {
case Some(value) => s"Value is $value"
case None => "No value"
}
println(result) // Output: Value is 5Exercicis Pràctics
Exercici 1
Escriu una funció que utilitzi la coincidència de patrons per determinar si un nombre és parell o senar.
def evenOrOdd(x: Int): String = {
x % 2 match {
case 0 => "even"
case 1 => "odd"
}
}
// Prova la funció
println(evenOrOdd(4)) // Output: even
println(evenOrOdd(7)) // Output: oddExercici 2
Escriu una funció que utilitzi la coincidència de patrons per descompondre una llista i retornar el seu primer element, si existeix.
def firstElement[A](list: List[A]): Option[A] = {
list match {
case head :: _ => Some(head)
case Nil => None
}
}
// Prova la funció
println(firstElement(List(1, 2, 3))) // Output: Some(1)
println(firstElement(Nil)) // Output: NoneResum
La coincidència de patrons és una eina poderosa en Scala que permet descompondre i analitzar estructures de dades de manera clara i concisa. Hem vist com utilitzar patrons literals, variables, constructors, tuples i llistes, així com com afegir guardes per refinar la coincidència. També hem après la importància de la coincidència exhaustiva per evitar errors en temps d'execució. Amb aquests coneixements, estàs preparat per utilitzar la coincidència de patrons en els teus projectes Scala.
Curs de Programació en Scala
Mòdul 1: Introducció a Scala
- Introducció a Scala
- Configuració de l'Entorn de Desenvolupament
- Conceptes Bàsics de Scala: Sintaxi i Estructura
- Variables i Tipus de Dades
- Operacions Bàsiques i Expressions
Mòdul 2: Estructures de Control i Funcions
- Declaracions Condicionals
- Bucles i Iteracions
- Funcions i Mètodes
- Funcions d'Ordre Superior
- Funcions Anònimes
Mòdul 3: Col·leccions i Estructures de Dades
- Introducció a les Col·leccions
- Llistes i Arrays
- Conjunts i Mapes
- Tuples i Options
- Coincidència de Patrons
Mòdul 4: Programació Orientada a Objectes en Scala
- Classes i Objectes
- Herència i Traits
- Classes Abstractes i Classes Case
- Objectes Companys
- Objectes Singleton
Mòdul 5: Programació Funcional en Scala
- Immutabilitat i Funcions Pures
- Estructures de Dades Funcionals
- Monads i Functors
- For-Comprehensions
- Gestió d'Errors en la Programació Funcional
Mòdul 6: Conceptes Avançats de Scala
- Conversions i Paràmetres Implícits
- Classes de Tipus i Polimorfisme
- Macros i Reflexió
- Concurrència en Scala
- Introducció a Akka
