soc*_*soc 19 scala class case pattern-matching unapply
考虑这个课程:
class DateTime(year: Int, month: Int, day: Int)(hour: Int, minute: Int, second: Int)
Run Code Online (Sandbox Code Playgroud)
该unapply
方法将如何,如果我想匹配以下内容:
dt match {
case DateTime(2012, 12, 12)(12, _, _) => // December 12th 2012, 12 o'clock
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
我试过这个:
def unapply(dt: DateTime) =
Some((dt.year, dt.month, dt.day),(dt.hour, dt.minute, dt.second))
Run Code Online (Sandbox Code Playgroud)
但这并没有真正起作用.
Rex*_*err 22
案例类仅在第一组参数上匹配(并执行其他漂亮的事情):
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
Run Code Online (Sandbox Code Playgroud)
如果它不是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
Run Code Online (Sandbox Code Playgroud)
仅仅基于Rex的答案,不仅可以在第一个参数块上进行模式匹配,而且这种行为非常符合设计.
更有趣的问题是为什么案例类,作为代数数据类型,甚至支持多个参数列表......
没有足够的理由为case类添加特殊行为,并且多个参数列表非常有用.在生产代码中,此工具通常仅用于提供隐式参数,您很自然地不希望模式匹配.
归档时间: |
|
查看次数: |
3236 次 |
最近记录: |