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

时间:2014-06-07 16:07:32

标签: 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

...

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

e.g。我不想在下面的代码片段中写下大量的下划线:

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

2 个答案:

答案 0 :(得分: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: [I@16a75c0 (of class [I)

答案 1 :(得分:-1)

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