0

我正在查看PartialFunctionScala 的源代码。在该文件中,定义了特征PartialFunction以及伴随对象PartialFunction。伴随对象具有方法condcondOpt

链接: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)从哪里出现。

有人可以在这两种方法存在的地方提供帮助。

谢谢!

4

2 回答 2

3

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,但不是调用超类方法,而是从匿名实例内部调用具体类方法。

于 2021-07-06T16:41:17.863 回答
2

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

于 2021-07-06T16:38:12.920 回答