微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 考虑此类:
class DateTime(year: Int,month: Int,day: Int)(hour: Int,minute: Int,second: Int)
如果我想与以下内容匹配,则look1:方法的外观如何:
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))
但这并没有真正起作用。     

解决方法

        案例类仅在第一组参数上匹配(并做其他一些漂亮的事情):
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定义为所需的任何内容,因此这实际上取决于该类的实现者。默认情况下,没有取消应用,因此您只能在类型上进行匹配。 如果要使用精美的案例类功能,包括能够在所有事物上进行匹配和相等,但又要进行某种划分,则可以嵌套案例类:
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
    ,        仅基于Rex的答案,不仅可以只在第一个参数块上进行模式匹配,而且这种行为在很大程度上取决于设计。 更加有趣的问题是为什么案例类作为代数数据类型甚至支持多个参数列表... 没有足够强的理由为案例类添加特殊行为,而且多个参数列表非常有用。在生产代码中,此功能通常仅用于提供隐式参数,您很自然地不希望进行模式匹配。     ,        它可能不起作用,因为Scala没有逗号运算符,并且您正在从提取程序中返回
Some((a,b),(x,y))
。如果您改用
Some(((a,b,c),y,z)))
(即
Tuple2[Tuple3[A,B,C],Tuple3[X,Y,Z]]
,我认为它可能会起作用)。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。