Reconocimiento de patrones

Nota de traducción: Es dificil encontrar en nuestro idioma una palabra que se relacione directamente con el significado de match en inglés. Podemos entender a match como "coincidir" o "concordar" con algo. En algunos lugares se utiliza la palabra machear, aunque esta no existe en nuestro idioma con el sentido que se le da en este texto, sino que se utiliza como traducción de match.

Scala has a built-in general pattern matching mechanism. It allows to match on any sort of data with a first-match policy. Here is a small example which shows how to match against an integer value:

Scala tiene incorporado un mecanismo general de reconocimiento de patrones. Este permite identificar cualquier tipo de datos una política primero-encontrado. Aquí se muestra un pequeño ejemplo el cual muestra cómo coincidir un valor entero:

object MatchTest1 extends App {
  def matchTest(x: Int): String = x match {
    case 1 => "one"
    case 2 => "two"
    case _ => "many"
  }
  println(matchTest(3))
}

El bloque con las sentencias case define una función la cual mapea enteros a cadenas de caracteres (strings). La palabra reservada match provee una manera conveniente de aplicar una función (como la función anterior) a un objeto.

Aquí se muestra un ejemplo el cual machea un valor contra un patrón de diferentes tipos:

object MatchTest2 extends App {
  def matchTest(x: Any): Any = x match {
    case 1 => "one"
    case "two" => 2
    case y: Int => "scala.Int"
  }
  println(matchTest("two"))
}

El primer case coincide si x se refiere a un valor entero 1. El segundo case coincide si x es igual al string "two". El tersero consiste en un patron tipado (se provee un tipo); se produce una coincidencia contra cualquier entero que se provea y además se liga la variable y al valor pasado x de tipo entero.

El reconocimiento de patrones en Scala es más útil para hacer coincidir tipos algebráicos expresados mediante clases case. Scala también permite la definición de patrones independientemente de las clases case, a través del método unapply de objetos extractores.

blog comments powered by Disqus