案例类匹配

时间:2014-09-20 17:14:04

标签: scala pattern-matching

如果有人能用简单的英语解释这种行为,我会非常感激。具体而言,case _:Foocase Foo()之间是否存在差异?

myvariable match {
  case _: Foo => println("its a foo!")
  case Foo() => println("It's also a Foo")
  case Foo => println("Oops, this will *not* match a Foo! It will never be called")
  case _ => println("This will be called for all unmatched items")
}

1 个答案:

答案 0 :(得分:4)

这是一种普通的类型匹配,有点像Java中的instanceOf。

case x: Foo => ???

它保证您可以在右侧使用x作为Foo

case Foo(a,b,c) => ???

另一方面,尝试调用unapply(在案例类中免费获得)并允许您“进入”实例并将所有字段作为可以在右侧使用的val来捕获。

附注:定义没有字段的case类与使用case对象基本相同,这是大多数人在Scala中只表示一个可能的值。所以你的第二种情况有点奇怪,而且很可能使用case对象来完成:

case object Foo

case Foo => ???