2014-11-25 2 views
6

Kann ich so etwas tun, mit einer Schnur:Kopf :: Schwanz Musterabgleich für Streicher

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

wo head das erste Zeichen und tail ist die verbleibende Zeichenfolge?

In dem obigen Code die Art der head ist Any, und ich möchte es String oder Char sein.

Antwort

7

case h +: t bedeutet case +:(h, t). Es gibt object +: mit unapply Methode.

Methode unapply Objekt +: für SeqLike nur definiert und ist nicht StringSeqLike.

Sie benötigen eine benutzerdefinierte unapply Methode wie folgt:

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))