2013-04-16 50 views
0

如果你有Scala中的一個模式匹配(情況),例如:如何確定scala模式匹配情況下的catch的類型?

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

有沒有辦法來確定哪些類型實際上是陷入了包羅萬象的?

+0

理想情況下,您不會販賣'Any',這是'String'和'Float'唯一常見的超類型。 –

+0

我有一個從第三方庫調用的演員,沒有記錄它發送的所有類型....但感謝您的快速答案! –

回答

2
foo match { 
    case a: String => doSomething(a) 
    case f: Float => doSomethingElse(f) 
    case x => println(x.getClass) 
} 
5
case x => println(x.getClass) 

太容易了:-)

基本上,你只需要值在包羅萬象的聲明綁定到一個名稱(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 
+1

類不是真正的類型。可能有許多類型映射到一個類。 –