apply定义在Function1的父类上PartialFunction(注意A => B是 的语法糖Function1[A, B])。isDefinedAt直接在PartialFunctiontrait上定义。请注意,两者都是抽象的。如果你写一个函数,你有责任确定做什么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指的是那个匿名对象。如果我们apply按照 来实现this.apply,那将是无限递归。可以将其想象PartialFunction.this为类似super,但不是调用超类方法,而是从匿名实例内部调用具体类方法。