2011-04-30 71 views
5

我看到這樣的代碼:PartialFunction型

abstract class AnalyserInfo 
case class ColumnC(typeName:String,fieldName:String) extends AnalyserInfo 
case class TableC(typeName:String) extends AnalyserInfo 

    val asIs :PartialFunction[AnalyserInfo,String] = { 
     case ColumnC(_,f) => f; 
     case TableC(typeName) => typeName 
    } 

是用什麼區別:

val asIs: (AnaliserInfo)=>String = (info) => info match { 
    case ColumnC(_,f) => f; 
    case TableC(typeName) => typeName 
} 

有一個首選的樣式?爲什麼在第一種情況下匹配關鍵字可以省略?

感謝您的支持。

回答

8

Double => Double只是Function[Double, Double]的簡寫。 PartialFunction繼承自Function,但增加了一些方法。最重要的是,它增加了方法isDefinedAt,它允許您查詢函數是否爲某些參數定義。

case•不用匹配是一種特殊語法來定義部分功能,其產生isDefinedAt返回true所有相配case秒。

說,我們有1/X,但只爲x的正值返回功能,我們可以把它定義爲:

scala> val f: (Double => Double) = { case x if x > 0 => 1/x }    
f: (Double) => Double = <function1> 

或爲:

scala> val g: PartialFunction[Double, Double] = { case x if x > 0 => 1/x } 
g: PartialFunction[Double,Double] = <function1> 

第二版有我們可以檢查該功能是否適用於某些參數的好處:

scala> g.isDefinedAt(-3) 
res0: Boolean = false 

此功能適用於在Scala中用於實現Actor的庫的示例,其中Actor只能使用某些類型的消息。

+0

偉大的答案,你解決我的懷疑以優秀的方式。 – 2011-04-30 13:55:37