2016-10-06 4 views
1

ich eine Liste erstellt haben, wie untenListe Zersetzung mit Fallklassen und Extraktor Objekte

List (1, 2, 3, 4) 
res4: List[Int] = List(1, 2, 3, 4) 

Mit diesem, wenn ich Pattern-Matching tun, wie unten

res4 match { 
    case ::(head, tail) => println (head); println(tail); 
    } 

mich gibt:

1 
List(2, 3, 4) 

was erwartet wird. so weit

res6: scala.collection.immutable.::[Int] = List(2, 3, 4) 

Keine Probleme: Als nächstes, wenn ich die folgenden als Extraktor Objekt versuchen

(::)(2, List(3, 4)) 

gibt mir. Wenn ich die folgende Als nächstes versuchen:

res4 match { 
    case :+(head, tail) => println (head); println(tail); 
} 

ich

List(1, 2, 3) 
4 

Noch keine Probleme. Wenn nun versuchen, die: + Extraktor Objekt, auf folgende Weise:

(:+)(List(1, 2), 3) 

ich die folgende Fehlermeldung erhalten:

<console>:12: error: scala.collection.:+.type does not take parameters 
    (:+)(List(1, 2), 3) 

Was hier das Problem sein könnte? Gibt es kein: + Extraktorobjekt? Wenn nein, wie funktioniert es dann innerhalb des Mustervergleichs?

Antwort

1

What could be the issue here? Is there no :+ extractor object defined ? If no, then how come it works inside the pattern matching?

Das Problem ist, dass das Objekt unterstützt ein :+unapply-Verfahren, das ist das, was für die Extractor Muster verwendet wird in Musterabgleich zu arbeiten, ist aber nicht ein apply Verfahren unterstützen:

/** An extractor used to init/last deconstruct sequences. */ 
object :+ { 
    /** Splits a sequence into init :+ tail. 
    * @return Some((init, tail)) if sequence is non-empty. None otherwise. 
    */ 
    def unapply[T,Coll <: SeqLike[T, Coll]](
     t: Coll with SeqLike[T, Coll]): Option[(Coll, T)] = 
    if(t.isEmpty) None 
    else Some(t.init -> t.last) 
} 

Daher erhalten Sie einen Kompilierzeitfehler. Wenn Sie darüber nachdenken, macht dies Sinn, was sollte das Ergebnis einer :+ gelten?

+0

Danke Yuval. Ja, (: +) Beantragen Sie, dass Sie kein Mitglied sind. Ich hätte das überprüfen sollen. – soupybionics