在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
}
Run Code Online (Sandbox Code Playgroud)
有什么区别:
val asIs: (AnaliserInfo)=>String = (info) => info match {
case ColumnC(_,f) => f;
case TableC(typeName) => typeName
}
Run Code Online (Sandbox Code Playgroud)
有一个首选的风格?为什么在第一种情况下可以省略match关键字?
谢谢你的支持.
Double => Double只是一个简写Function[Double, Double].PartialFunction继承自Function但添加了一些方法.最重要的是,它添加了一个方法isDefinedAt,允许您查询是否为某个参数定义了函数.
case没有匹配的s是定义部分函数的特殊语法,它生成一个isDefinedAt返回true所有匹配的cases.
假设我们有一个返回1/x的函数,但只有x的正值,我们可以定义为:
scala> val f: (Double => Double) = { case x if x > 0 => 1/x }
f: (Double) => Double = <function1>
Run Code Online (Sandbox Code Playgroud)
或作为:
scala> val g: PartialFunction[Double, Double] = { case x if x > 0 => 1/x }
g: PartialFunction[Double,Double] = <function1>
Run Code Online (Sandbox Code Playgroud)
第二个版本的好处是我们可以检查该函数是否适用于某个参数:
scala> g.isDefinedAt(-3)
res0: Boolean = false
Run Code Online (Sandbox Code Playgroud)
例如,在Scala中使用此功能来实现actor库,其中Actor可能只使用某些类型的消息.
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |