我正在看Scala的PartialFunction源代码。在该文件中,定义了特征PartialFunction以及伴随对象PartialFunction。与之配套的对象有cond和condOpt方法。
链接:https://github.com/othiym23/scala/blob/master/src/library/scala/PartialFunction.scala
当我查看andThen以及orElse函数时,出现了以下方法调用。
1. PartialFunction.this.isDefinedAt(x)
2. PartialFunction.this.apply(x)我不确定这些函数(isDefinedAt / apply)是从哪里来的。
有没有人能帮个忙,这两种方法都存在。
谢谢!
发布于 2021-07-07 00:41:18
apply是在Function1上定义的,它是PartialFunction的父类(注意,A => B是Function1[A, B]的语法糖)。isDefinedAt直接在PartialFunction trait上定义。请注意,两者都是抽象的。如果你写了一个函数,你要负责确定apply做了什么。如果你编写了一个分部函数,你要负责确定它的定义位置。
如果使用部分函数语法,isDefinedAt通常会被编译器迷惑。所以如果我们写下
val f: PartialFunction[Option[Int], Int] = { case Some(x) => x }然后我们就可以
f.isDefinedAt(None) // false
f.isDefinedAt(Some(1)) // true编辑:根据你的评论,你被PartialFunction.this.apply搞糊涂了。请注意执行此操作的上下文。
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,但我们不是调用超类方法,而是从匿名实例内部调用具体的类方法。
发布于 2021-07-07 00:38:13
我猜是Function1,因为PartialFunction扩展了A => B https://github.com/othiym23/scala/blob/master/src/library/scala/Function1.scala
https://stackoverflow.com/questions/68274281
复制相似问题