首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在一个类中匹配多个参数列表?

如何在一个类中匹配多个参数列表?
EN

Stack Overflow用户
提问于 2011-05-28 03:09:23
回答 3查看 3.9K关注 0票数 21

考虑这个类:

代码语言:javascript
复制
class DateTime(year: Int, month: Int, day: Int)(hour: Int, minute: Int, second: Int)

如果我想匹配如下内容,unapply方法看起来会是什么样子:

代码语言:javascript
复制
dt match {
  case DateTime(2012, 12, 12)(12, _, _) => // December 12th 2012, 12 o'clock
  /* ... */
}

我试过这个:

代码语言:javascript
复制
def unapply(dt: DateTime) = 
  Some((dt.year, dt.month, dt.day),(dt.hour, dt.minute, dt.second))

但这并不是真的有效。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-28 03:18:20

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

代码语言:javascript
复制
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类特性,包括能够匹配并在所有东西上做相等,但有某种划分,你可以嵌套case类:

代码语言:javascript
复制
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
票数 24
EN

Stack Overflow用户

发布于 2011-05-28 07:04:16

根据Rex的回答,您不仅可以在第一个参数块上进行模式匹配,而且这种行为在很大程度上是设计出来的。

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

没有足够充分的理由为case类添加特殊的行为,并且多参数列表被证明是非常有用的。在生产代码中,此功能通常仅用于提供隐式参数,您自然不希望进行模式匹配。

票数 10
EN

Stack Overflow用户

发布于 2011-05-28 06:36:24

它可能无法工作,因为Scala没有逗号运算符,而您从提取器返回Some((a,b),(x,y))。如果你使用Some(((a,b,c),(x,y,z))) (例如一个Tuple2[Tuple3[A,B,C],Tuple3[X,Y,Z]] ),我想它可能会工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6156656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档