2011-12-29 10 views
7

Dada esta coincidencia de patrón:Scala utilizando :: listas para

List(1,2,3) match { 
    case head :: tail => println(">>> head=" + head) 
} 

Estoy asumiendo que '::' es la clase de caso que se encuentra en scala.collection.immutable, pero ¿cómo es ':: 'permitido escribir en esa forma (notación infija)? - ¿hay una regla específica para permitir eso?

Gracias

+2

Es posible que desee consultar [descomposición de la coincidencia de Scala en el operador infijo] (http://stackoverflow.com/questions/1022218/scala-match-decomposition-on-infix-operator) y [¿Cómo es esta clase de caso coincide con p ¿funciona attern?] (http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-pattern-working) – 4e6

Respuesta

25

Puede incluso escribir:

val head :: tail = List(1, 2, 3) 

Básicamente cualquier cosa donde se espera un patrón(una misión, una declaración match o una línea en una de-comprensión) puede tomar una extractora, que es definido como una entidad con un método unapply.

Una de las piezas de azúcar sintáctico que Scala le ofrece es eso; si tiene un extractor X(a, b), esto se puede escribir como a X b. He aquí un ejemplo con las clases de casos (que tienen un extractor por defecto):

scala> case class X(a: Int, b: String) 
defined class X 

scala> val a X b = X(1, "two") 
a: Int = 1 
b: String = two 

La capacidad de escribir estas entidades infija se extiende a tipos así:

scala> type MappedTo[A, B] = Map[A, B] 
defined type alias MappedTo 

scala> def foo(m: Int MappedTo String) = m foreach println 
foo: (m: MappedTo[Int,String])Unit 

Tenga en cuenta que en ninguno de los casos, hace scala restringe tales operadores de infijo a identificadores simbólicos

2

Scala en realidad tiene una clase inmutable :: que representa la lista no vacía (el complemento a Nil). Hay una notación infija para las clases (que también es cómo funcionan cosas como A <:< B) que le permite escribir head :: tail en lugar de ::(head, tail). Dado que :: es una clase de caso, tiene un valor predeterminado unapply que hace que case funcione como lo ilustra.

Cuestiones relacionadas