模式的参数数量错误

时间:2013-09-13 15:41:01

标签: scala

有一个类有很长的构造函数参数列表:

case class ClassA(a: Int, b: String, c: Int /*and so on*/)

我需要对它进行模式匹配:

val cls = getClassA
cls match {
  case ClassA(a, _, _, _, _, /* and so on */) => Some(a)
  case ClassA(_, _, c, _, _, /* and so on */) => Some(c)
  case _ => None
}

我需要捕获ac的值。如果我真的不需要它们,是否有可能不按_指定所有其他参数?

val cls = getClassA
    cls match {
      case ClassA(a, _*) => Some(a)
      case ClassA(_, _, c, _*) => Some(c)
      case _ => None
    }

它给了我错误:wrong number of arguments for pattern ClassA(a, b, /*and so on*/)

2 个答案:

答案 0 :(得分:7)

在案例类中,您需要在匹配时指定整个参数列表。

另一种方法是实现您自己的unapply方法,该方法可以正确处理您传递的任何参数。

答案 1 :(得分:4)

由于案例类的伴随对象具有unapply方法,而不是unapplySeq,因此它不起作用。

如果您想使用unapply仅针对一个字段进行检查,则可以定义如下内容:

object ClassAByA {
  def unapply(obj: ClassA) = Some(obj.a)
}

val ClassAByA(x) = ClassA(100, "thousand", 10000.0)
// x is equal 100 now

ClassA(100, "a", 10000.0) match {
  case ClassAByB(str) => str // str is equal "a" now
}

或者你可以写:

something match {
  case c: ClassA => c.b
}