Question Extracteurs Scala - ignore les paramètres non utilisés


donné le code suivant:

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

...

Lors de l'utilisation de l'extracteur généré, est-il possible de sauter les paramètres restants, en supposant qu'ils ne soient pas utilisés?

par exemple. Je ne veux pas écrire beaucoup de traits de soulignement dans l'extrait de code suivant:

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

11
2018-06-07 16:07


origine


Réponses:


Une approche simple pour fournir des extracteurs pour tuplé classes qui s'appuie en fait sur Array extracteurs, contournant ainsi le problème initial.

Laisser

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

et ainsi de suite

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

on peut extraire les deux premiers éléments dans un octet comme celui-ci,

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

Notez que cela ne résout pas le problème de sauter les paramètres restants dans les classes de cas définies ci-dessus.

Notez également une faiblesse de cette approche, illustrée comme suit,

scala> val Array(a,b) = Array(1)
scala.MatchError: [I@16a75c0 (of class [I)

2
2018-06-08 06:34



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

-1
2018-06-07 17:36