首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala中的PartialFunction

Scala中的PartialFunction
EN

Stack Overflow用户
提问于 2021-07-07 00:31:48
回答 2查看 61关注 0票数 0

我正在看Scala的PartialFunction源代码。在该文件中,定义了特征PartialFunction以及伴随对象PartialFunction。与之配套的对象有condcondOpt方法。

链接:https://github.com/othiym23/scala/blob/master/src/library/scala/PartialFunction.scala

当我查看andThen以及orElse函数时,出现了以下方法调用。

代码语言:javascript
复制
1. PartialFunction.this.isDefinedAt(x)
2. PartialFunction.this.apply(x)

我不确定这些函数(isDefinedAt / apply)是从哪里来的。

有没有人能帮个忙,这两种方法都存在。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-07-07 00:41:18

apply是在Function1上定义的,它是PartialFunction的父类(注意,A => BFunction1[A, B]的语法糖)。isDefinedAt直接在PartialFunction trait上定义。请注意,两者都是抽象的。如果你写了一个函数,你要负责确定apply做了什么。如果你编写了一个分部函数,你要负责确定它的定义位置。

如果使用部分函数语法,isDefinedAt通常会被编译器迷惑。所以如果我们写下

代码语言:javascript
复制
val f: PartialFunction[Option[Int], Int] = { case Some(x) => x }

然后我们就可以

代码语言:javascript
复制
f.isDefinedAt(None) // false
f.isDefinedAt(Some(1)) // true

编辑:根据你的评论,你被PartialFunction.this.apply搞糊涂了。请注意执行此操作的上下文。

代码语言:javascript
复制
new PartialFunction[A1, B1] {
    def isDefinedAt(x: A1): Boolean = 
      PartialFunction.this.isDefinedAt(x) || that.isDefinedAt(x)
    def apply(x: A1): B1 = 
      if (PartialFunction.this.isDefinedAt(x)) PartialFunction.this.apply(x) 
      else that.apply(x)
  }

我们在一个新的匿名对象中。this指的是那个匿名对象。如果我们用this.apply来实现apply,那么它将是无限递归。可以将PartialFunction.this想象成类似于super,但我们不是调用超类方法,而是从匿名实例内部调用具体的类方法。

票数 3
EN

Stack Overflow用户

发布于 2021-07-07 00:38:13

我猜是Function1,因为PartialFunction扩展了A => B https://github.com/othiym23/scala/blob/master/src/library/scala/Function1.scala

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

https://stackoverflow.com/questions/68274281

复制
相关文章

相似问题

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