English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Coincidencia de patrones en Scala

Scala ofrece un mecanismo de ajuste de patrones muy potente y su aplicación es muy amplia.

Un ajuste de patrones contiene una serie de opciones, cada una comienza con la palabra clave case。Cada opción contiene un patrón y uno o más expresiones. El símbolo de flecha => separó los patrones y las expresiones.

A continuación se muestra un ejemplo simple de ajuste de patrones con valores enteros:

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))
   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

Ejecutar el código anterior, el resultado de salida será:

$ scalac Test.scala 
$ scala Test
many

match corresponde a switch en Java, pero se escribe después de la expresión del selector. Es decir: Selector match {opciones}。

La expresión match intenta cada patrón en el orden en que se escriben los códigos para completar el cálculo, y no se seguirá ajustando el resto de los casos una vez que se encuentre un caso que coincide.

Ahora veamos un ejemplo de ajuste de patrones con tipos de datos diferentes:

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))
   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

Ejecutar el código anterior, el resultado de salida será:

$ scalac Test.scala 
$ scala Test
2
many
one
scala.Int

El primer caso del ejemplo corresponde al valor numérico entero 1,el segundo caso corresponde al valor de cadena "two", el tercer caso corresponde a un patrón de tipo, utilizado para determinar si el valor传入 es un entero, es mejor usar ajuste de patrones en lugar de isInstanceOf para determinar el tipo. El cuarto caso representa la opción de ajuste por defecto, es decir, la opción de ajuste cuando no se encuentra otro ajuste, similar a default en switch.

Uso de clase de muestra

Las definiciones de clase que utilizan la palabra clave case son clases de muestra (case classes), que son un tipo especial de clase optimizada para el ajuste de patrones.

A continuación, se muestra un simple ejemplo de clase de muestra:

object Test {
   def main(args: Array[String]) {
        val alice = new Person("Alice", 25)
        val bob = new Persona("Bob", 32)
        val charlie = new Persona("Charlie", 32)
   
    )- for (persona <
        List(alice, bob, charlie)) {
            persona match { 25) => println("¡Hola, Alice!")
            ) => println("¡Hola, Alice!") 32) => println("¡Hola, Bob!")
            case Persona(nombre, edad) =>
               println("Edad: " + edad + "año, nombre: " + nombre + "?"
         }
      }
   }
   // Clase de ejemplo
   case class Persona(nombre: String, edad: Int)
}

Ejecutar el código anterior, el resultado de salida será:

$ scalac Test.scala 
$ scala Test
¡Hola, Alice!
¡Hola, Bob!
Edad: 32 año, ¿nombre: Charlie?

Al declarar una clase de ejemplo, ocurre el siguiente proceso automáticamente:

  • Cada parámetro del constructor se convierte en val, a menos que se declare explícitamente como var, pero no se recomienda hacerlo;

  • Se proporciona el método apply en el objeto acompañante, por lo que no es necesario usar la palabra clave new para construir objetos;

  • Proporcionar el método unapply para que la coincidencia de patrones funcione;

  • Generar métodos toString, equals, hashCode y copy, a menos que se proporcione explícitamente la definición de estos métodos.