Class 如何对具有多个参数列表的类进行模式匹配?

Class 如何对具有多个参数列表的类进行模式匹配?,class,scala,pattern-matching,case,unapply,Class,Scala,Pattern Matching,Case,Unapply,以这一类为例: class DateTime(year: Int, month: Int, day: Int)(hour: Int, minute: Int, second: Int) 如果我想与以下内容进行匹配,unapply方法会是什么样子: dt match { case DateTime(2012, 12, 12)(12, _, _) => // December 12th 2012, 12 o'clock /* ... */ } 我试过这个: def unapply(

以这一类为例:

class DateTime(year: Int, month: Int, day: Int)(hour: Int, minute: Int, second: Int)
如果我想与以下内容进行匹配,
unapply
方法会是什么样子:

dt match {
  case DateTime(2012, 12, 12)(12, _, _) => // December 12th 2012, 12 o'clock
  /* ... */
}
我试过这个:

def unapply(dt: DateTime) = 
  Some((dt.year, dt.month, dt.day),(dt.hour, dt.minute, dt.second))
但这并没有真正起作用。

Case类只在第一组参数上匹配(并做其他漂亮的事情):

scala> case class A(i: Int)(j: Int) { }
defined class A

scala> A(5)(4) match { case A(5) => "Hi" }
res14: java.lang.String = Hi

scala> A(5)(4) == A(5)(9)
res15: Boolean = true
如果它不是一个case类,您可以将unapply定义为您想要的任何内容,因此它实际上取决于类的实现者。默认情况下,没有unapply,因此只能在类型上进行匹配

如果您想使用漂亮的case类功能,包括能够匹配并在所有事情上实现相等,但有某种划分,您可以嵌套case类:

case class Time(hour: Int, minute: Int, second: Int) { }
case class Date(year: Int, month: Int, day: Int) { }
case class DateTime(date: Date, time: Time) { }

scala> val dt = DateTime(Date(2011,5,27), Time(15,21,50))
scala> dt match { case DateTime(Date(2011,_,_),Time(h,m,50)) => println(h + ":" + m) }
15:21

它可能不起作用,因为Scala没有逗号运算符,您正在从提取器返回
一些((a,b),(x,y))
。如果你用
Some((a,b,c),(x,y,z))
来代替(即a
Tuple2[Tuple3[a,b,c],Tuple3[x,y,z]
我认为它可能会起作用。

仅仅是基于Rex的答案,你不仅可以在第一个参数块上进行模式匹配,而且这种行为在很大程度上是设计的

更有趣的问题是为什么作为代数数据类型的case类甚至支持多参数列表


没有足够有力的理由为案例类添加特殊行为,多参数列表非常有用。在生产代码中,此功能通常仅用于提供隐式参数,您自然不希望模式匹配。

多参数列表很好,因为您可以使用多参数列表le var args列表。也许这是一个有点做作的例子,但是如果你可以说
case class MyCase[这是避免case class诱惑的另一个原因。它们与语言的许多高级特性(或概念)不太匹配。