在scala play框架中,我看到了以下代码:
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
}有更好的款式吗?为什么在第一种情况下可以省略匹配关键字?
感谢您的支持。
发布于 2011-04-30 19:08:56
Double => Double只是Function[Double, Double]的缩写。PartialFunction继承自Function,但添加了一些方法。最重要的是,它添加了方法isDefinedAt,该方法允许您查询是否为某个参数定义了函数。
没有匹配的case是一种特殊的语法,用于定义部分函数,它会生成一个为所有匹配的case返回true的isDefinedAt。
假设我们有一个返回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可能只使用某些类型的消息。
https://stackoverflow.com/questions/5841156
复制相似问题