2014-11-25 4 views
6

Posso fare qualcosa di simile con una stringa:testa :: pattern matching coda per le stringhe

s match { 
    case "" => ... 
    case head +: tail => ... 
} 

dove head è il primo carattere e tail è la stringa restante?

Nel codice sopra riportato il tipo di head è Any e mi piacerebbe che fosse String o Char.

risposta

7

case h +: t significa case +:(h, t). C'è il object +: con il metodo unapply.

Metodo unapply dell'oggetto +: è definito solo per SeqLike e String non è SeqLike.

È necessario un costume unapply metodo come questo:

object s_+: { 
    def unapply(s: String): Option[(Char, String)] = s.headOption.map{ (_, s.tail) } 
} 

"abc" match { 
    case h s_+: t => Some((h, t)) 
    case _ => None 
} 
// Option[(Char, String)] = Some((a,bc))