2014-06-07 5 views
10

дал следующий код: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 
+0

Я предлагаю кусать пулю и писать подчеркивание, или (еще лучше), пытаясь разбить классы тематические на более мелкие куски. –

+2

В настоящее время это невозможно, но есть предложения разрешить сопоставление с именованными и стандартными параметрами (см. [Здесь] (https://issues.scala-lang.org/browse/SI-5323) и [здесь] (https://issues.scala-lang.org/browse/SI-6524)), что позволило бы легко синтаксис для этого. – wingedsubmariner

+0

Связанный: http://stackoverflow.com/questions/3474125/how-to-pattern-match-large-scala-case-classes –

ответ

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

Я не являюсь нисходящим, но на самом деле это не ответ, если «когда используя сгенерированный экстрактор "часть вопроса. –

+0

Я тоже. Предлагаемый мной фрагмент кода приветствуется, просто чтобы решить проблему, поэтому для этого конкретного использования решение @ kulikov, безусловно, чище. Однако в случае сложных применений, например, вложенные экстракторы, использование экстрактора может быть единственным способом, поэтому вопрос. – vucalur

+1

@vucalur: Если бы у меня был подходящий способ по типу, это было бы рассмотрено как передовая техника и защищено импортом. Иногда это полезно, но обычно это запах кода и имеет множество странных ограничений с дженериками. –

2

Простой подход к обеспечению экстракторов для tupled классов, которые опираются на самом деле в 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 

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

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

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