0

如果您在 Scala 中有模式匹配(大小写),例如:

foo match {
  case a: String => doSomething(a)
  case f: Float =>  doSomethingElse(f)
  case _ => ? // How does one determine what this was?
}

有没有办法确定什么类型实际上被捕获了?

4

2 回答 2

5
case x => println(x.getClass)

太容易了 :-)

基本上,您只需要将 catch-all 语句中的值绑定到一个名称(x在这种情况下),然后您可以使用标准的 getClass 方法来确定类型。

如果您尝试根据类型执行特定逻辑,那么您可能做错了。如果您需要一些不想在其中定义内联的“默认”情况,您可以将匹配语句编写为部分函数。例如:

scala> val defaultHandler: PartialFunction[Any, Unit] = {
     | case x: String => println("String: " + x)
     | }
defaultHandler: PartialFunction[Any,Unit] = <function1>

scala> val customHandler: PartialFunction[Any, Unit] = {
     | case x: Int => println("Int: " + x)
     | }
customHandler: PartialFunction[Any,Unit] = <function1>

scala> (customHandler orElse defaultHandler)("hey there")
String: hey there
于 2013-04-16T19:53:36.940 回答
3
foo match {
  case a: String => doSomething(a)
  case f: Float =>  doSomethingElse(f)
  case x => println(x.getClass)
}
于 2013-04-16T19:53:35.510 回答