2011-12-29 11 views
7

Dato questo pattern match:scala partita caso utilizzando :: per gli elenchi

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

sto supponendo che '::' è la classe caso si trovano in scala.collection.immutable, ma come è ':: 'permesso di essere scritto in quella forma (notazione infisso)? - Esiste una regola specifica per consentirlo?

Grazie

+2

Si consiglia di guardare [Scala scomposizione partita su operatore infisso] (http://stackoverflow.com/questions/1022218/scala-match-decomposition-on-infix-operator) e [Come è questa corrispondenza case case p attern working?] (http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-pattern-working) – 4e6

risposta

25

Si può anche scrivere:

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

In sostanza tutto ciò in cui un modello è previsto (un incarico, una dichiarazione match o di una riga in un per-di comprensione) può assumere un estrattore, che è definita come un'entità con un metodo unapply.

Uno dei pezzi di zucchero sintattico che scala ti fornisce è quello; se si dispone di un estrattore X(a, b), questo può essere scritto come a X b. Ecco un esempio con le classi di casi (che hanno un estrattore di default):

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 capacità di scrivere tali entità infissa estende a tipi così:

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 

Si noti che in entrambi i casi, lo fa scala limita tali operatori infissi agli identificatori simbolici

2

Scala ha in realtà una classe immutabile :: che rappresenta la lista non vuota (il complemento a Nil). C'è una notazione infisso per le classi (che è anche il modo in cui funzionano le cose come A <:< B) che ti permette di scrivere head :: tail invece di ::(head, tail). Dal momento che :: è un case class ha un valore predefinito unapply che fa funzionare case come illustrato.