有一个类有很长的构造函数参数列表:
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
}
我需要捕获a
或c
的值。如果我真的不需要它们,是否有可能不按_
指定所有其他参数?
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*/)
答案 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
}