2014-06-07 6 views
10

folgenden Code angegeben:Scala Extraktoren - überspringen nicht verwendeten Parameter

abstract class MyTuple 

... 

case class MySeptet(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int, g: Int) extends MyTuple 

case class MyOctet(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int, g: Int, h: Int) extends MyTuple 

... 

Wenn erzeugt Extraktor ist es möglich, Parameter Rest zu überspringen, nicht verwendete sie sind angenommen?

z.B. Ich will nicht viel Unterstrichen im folgenden Code-Schnipsel schreiben:

case MyOctet(a, b, _, _, _, _, _, _) => ... // uses only a and b 
+0

Ich würde vorschlagen, die Kugel zu beißen und die Unterstrichen schreiben, oder (noch besser) versuchen, Ihren Fall Klassen brechen sie in kleinere Stücke. –

+2

Dies ist zur Zeit nicht möglich, aber es gibt Vorschläge, die eine Übereinstimmung mit benannten und Standardparametern erlauben (siehe [hier] (https://issues.scala-lang.org/browse/SI-5323) und [hier] (https://issues.scala-lang.org/browse/SI-6524)), die eine einfache Syntax dafür erlauben würde. – wingedsubmariner

+0

Related: http://Stackoverflow.com/questions/3474125/how-to-pattern-match-large-scala-case-klassen –

Antwort

-1
case o: MyOctet => o.a + o.b 
+2

Ich bin nicht der Downvoter, aber das ist nicht wirklich eine Antwort angesichts der "wenn mit generierten Extraktor "Teil der Frage. –

+0

Ich auch nicht. Code-Snippet von mir vorgeschlagen ist hallo-worldish, nur um das Problem zu vermitteln, so für diese spezifische Verwendung @ Kulikov Lösung ist auf jeden Fall sauberer. Im Falle komplexer Anwendungen, z.B. verschachtelte Extraktoren, mit einem Extraktor könnte der einzige Weg zu gehen, daher die Frage. – vucalur

+1

@vucalur: Wenn ich meine Art auf diese Art anpassen würde, wäre dies eine fortgeschrittene Technik und durch einen Import geschützt. Es ist manchmal nützlich, aber ist in der Regel ein Code-Geruch und hat viele seltsame Einschränkungen mit Generika. –

2

Ein einfacher Ansatz Extraktoren für fach vervielfachten Klassen zu bieten, die in Array Extraktoren in der Tat beruht, damit das ursprüngliche Problem zu umgehen .

abstract class MyTuple (order: Int) 
case class MySeptet(coord: Array[Int]) extends MyTuple(7) 
case class MyOctet(coord: Array[Int]) extends MyTuple(8) 

Lassen und so für

val o = MyOctet((1 to 8).toArray) 

können wir die ersten beiden Elemente in einem Oktett wie diese

o match { 
    case MyOctet(Array(a,b,_*)) => a+b 
    case _ => 0 
} 
res: Int = 3 

Hinweis, extrahieren dies nicht das Problem der Überspringe verbleibende Parameter in den oben definierten Fallklassen.

Beachten Sie auch eine Schwäche dieses Ansatzes dargestellt, wie folgt,

scala> val Array(a,b) = Array(1) 
scala.MatchError: [[email protected] (of class [I) 
Verwandte Themen