2014-06-07 31 views
10

podano następujący kod:Scala odciągi - pomiń nieużywane parametry

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 

... 

Podczas korzystania wygenerowany wyciąg, czy to możliwe, aby pominąć pozostałe parametry, zakładając, że są nieużywane?

np. Nie chcę napisać mnóstwo podkreśleń w poniższym fragmencie kodu:

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

Sugeruję gryzie zęby i pisanie podkreślenia, lub (nawet lepiej) próbuje złamać swoje klasy przypadków na mniejsze kawałki. –

+2

Jest to obecnie niemożliwe, ale istnieją sugestie pozwalające na dopasowanie do nazwanych i domyślnych parametrów (patrz [tutaj] (https://issues.scala-lang.org/browse/SI-5323) i [tutaj] (https://issues.scala-lang.org/browse/SI-6524)), który umożliwiałby łatwą składnię tego. – wingedsubmariner

+0

Powiązane: http://stackoverflow.com/questions/3474125/how-to-pattern-match-large-scala-case-classes –

Odpowiedz

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

Nie jestem downvoter, ale to nie jest odpowiedź na pytanie "kiedy przy użyciu generowanego ekstraktora "część pytania. –

+0

Ja też nie. Proponowany przeze mnie fragment kodu jest "cześć światowy", tylko po to, by rozwiązać problem, więc do tego konkretnego zastosowania rozwiązanie @ kulikova jest zdecydowanie czystsze. Jednak w przypadku złożonych zastosowań, np. zagnieżdżone ekstraktory, używanie ekstraktora może być jedyną drogą do zrobienia, stąd pytanie. – vucalur

+1

@vucalur: Gdybym miał swoją metodę dopasowywania na takim typie, byłby uważany za zaawansowaną technikę i chroniony przez import. Czasami jest to przydatne, ale generalnie jest to zapach kodu i ma wiele dziwnych ograniczeń związanych z rodzajami. –

2

proste podejście do zapewniania extractory dla tupled klas, które opiera się w rzeczywistości w Array Wyciągi stąd pominięciem pierwotnego problemu .

Niech

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

i tak dla

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

możemy wyodrębnić dwa pierwsze elementy w oktetu takiego,

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

Uwaga ta nie rozwiązuje problemu pomijanie pozostałych parametrów w klasach przypadków zdefiniowanych powyżej.

Również zauważyć słabość tego podejścia, jak pokazano poniżej,

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