Scala экстракторы - пропустить неиспользуемые параметры

приведен следующий код:

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

...

При использовании сгенерированного экстрактора можно ли пропустить оставшиеся параметры, если они не используются?

например. Я не хочу писать много подчеркиваний в следующем фрагменте кода:

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

Ответ 1

Простой подход к предоставлению экстракторов для чередующихся классов, которые фактически используются в экстракторах Array, поэтому обходя исходную проблему.

Пусть

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

поэтому для

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

мы можем извлечь первые два элемента в октете, как это,

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

Обратите внимание, что это не относится к проблеме пропуска остальных параметров в классах case, определенных выше.

Также обратите внимание на слабость этого подхода, проиллюстрированную следующим образом:

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

Ответ 2

case o: MyOctet => o.a + o.b