2011-04-30 24 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

相关问题