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
指的是那个匿名对象。如果我们apply
按照 来实现this.apply
,那将是无限递归。可以将其想象PartialFunction.this
为类似super
,但不是调用超类方法,而是从匿名实例内部调用具体类方法。