2014-06-07 15 views
10

给出下面的代码:斯卡拉提取 - 跳过未使用的参数

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)和[here](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

我不是downvoter,但这不是一个真正的答案给予“什么时候使用生成的提取器“问题的一部分。 –

+0

我也没有。我提出的代码片段是hello-worldish,只是为了解决这个问题,所以对于具体的使用@ 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)