PartialFunction and MatchError

5
有两种定义PF的方式:1)使用文字语法case {},2)作为显式类。我需要以下函数抛出MatchError,但在第二种情况下不会发生这种情况。
1)使用case
val test: PartialFunction[Int, String] =  {
  case x if x > 100 => x.toString
}

2) 作为类

val test = new PartialFunction[Int, String] {
  def isDefinedAt(x: Int) = x > 100
  def apply(x: Int) = x.toString
}

在第二种情况下,我是否应该手动调用isDefinedAt?难道编译器不会自动调用它吗?
2个回答

4

在您的apply方法中,您将需要手动调用isDefinedAt

val test = new PartialFunction[Int, String] {
  def isDefinedAt(x: Int) = x > 100
  def apply(x: Int) = if(isDefinedAt(x)) x.toString else throw new MatchError(x)
}

如果您想避免这段代码,可以简单地使用第一种方法来定义您的部分函数。它是一种语法糖,并将导致isDefinedAtapply的有效定义。如Scala语言规范中所述,您的第一个定义将扩展为以下内容:
val test = new scala.PartialFunction[Int, String] {
  def apply(x: Int): String = x match {
    case x if x > 100 => x.toString
  }
  def isDefinedAt(x: Int): Boolean = {
    case case x if x > 100 => true
    case _ => false
  }
}

0

isDefinedAt 不是一个守卫条件:每次调用 PartialFunction 时都不会检查它。

在第一个情况下,MatchError 是由于模式匹配失败而发生的。实际上,您可以在 Scala Specification 的 §8.5 中找到第一个情况下 Partialfunction 的构建方式。

在第二种情况下,对于所有的 x 都定义了 apply,因此您对 isDefinedAt 的定义无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接