首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PartialFunction类型

PartialFunction类型
EN

Stack Overflow用户
提问于 2011-04-30 18:30:46
回答 1查看 438关注 0票数 5

在scala play框架中,我看到了以下代码:

代码语言:javascript
复制
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
    }

与以下各项有何区别:

代码语言:javascript
复制
val asIs: (AnaliserInfo)=>String = (info) => info match {
  case ColumnC(_,f) => f;
  case TableC(typeName) => typeName
}

有更好的款式吗?为什么在第一种情况下可以省略匹配关键字?

感谢您的支持。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-30 19:08:56

Double => Double只是Function[Double, Double]的缩写。PartialFunction继承自Function,但添加了一些方法。最重要的是,它添加了方法isDefinedAt,该方法允许您查询是否为某个参数定义了函数。

没有匹配的case是一种特殊的语法,用于定义部分函数,它会生成一个为所有匹配的case返回trueisDefinedAt

假设我们有一个返回1/x的函数,但仅对于x的正值,我们可以将其定义为:

代码语言:javascript
复制
scala> val f: (Double => Double) = { case x if x > 0 => 1/x }             
f: (Double) => Double = <function1>

或如下所示:

代码语言:javascript
复制
scala> val g: PartialFunction[Double, Double] = { case x if x > 0 => 1/x }
g: PartialFunction[Double,Double] = <function1>

第二个版本的好处是我们可以检查函数是否适用于某些参数:

代码语言:javascript
复制
scala> g.isDefinedAt(-3)
res0: Boolean = false

例如,在Scala中使用此功能来实现actor库,在该库中,Actor可能只使用某些类型的消息。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5841156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档