Scala提取器-跳过未使用的参数

Scala提取器-跳过未使用的参数,scala,pattern-matching,case-class,extractor,Scala,Pattern Matching,Case Class,Extractor,给定以下代码: 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 ... 当使用生成的提取器时,是否可

给定以下代码:

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

...
当使用生成的提取器时,是否可以跳过剩余的参数(假设它们未使用)

e、 g.我不想在下面的代码段中写太多下划线:

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

为元组类提供提取器的一种简单方法,它实际上依赖于
数组
提取器,因此绕过了原始问题

对我来说也是如此

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: [I@16a75c0 (of class [I)

我不是反对者,但这并不是问题中“使用生成提取器时”部分给出的答案。我也是。我提出的代码片段是hello worldish,只是为了解决这个问题,所以对于这个特定用途,@kulikov的解决方案显然更干净。但是,在复杂的使用情况下,例如嵌套提取器,使用提取器可能是唯一的方法,因此问题就来了。@vucalur:如果我在类型上有这样的匹配方式,将被视为一种高级技术,并受导入保护。它有时很有用,但通常是一种代码味道,并且对泛型有很多奇怪的限制。我建议咬紧牙关,写下划线,或者(甚至更好)尝试将您的case类分解为更小的部分。这目前是不可能的,但有一些建议允许与命名参数和默认参数匹配(请参阅和)这将允许使用简单的语法。相关:
o match {
  case MyOctet( Array(a,b,_*) ) => a+b
  case _ => 0
}
res: Int = 3
scala> val Array(a,b) = Array(1)
scala.MatchError: [I@16a75c0 (of class [I)