Dav*_*ber 0 scala case pattern-matching catch-all
如果Scala中有模式匹配(case),例如:
foo match {
case a: String => doSomething(a)
case f: Float => doSomethingElse(f)
case _ => ? // How does one determine what this was?
}
Run Code Online (Sandbox Code Playgroud)
有没有办法确定实际捕获的类型?
case x => println(x.getClass)
Run Code Online (Sandbox Code Playgroud)
太容易了 :-)
基本上,您只需要将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
Run Code Online (Sandbox Code Playgroud)