5

定义 PF 有两种方法:1)使用文字case {}语法和 2)作为显式类。我需要以下函数抛出一个 MatchError,但在第二种情况下不会发生。

1) 带外壳

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,不应该由编译器隐式调用吗?

4

2 回答 2

4

您将不得不isDefinedAt在您的方法中手动调用apply

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)
}

如果你想避免这段代码,你可以简单地使用第一种方法来定义你的部分函数。它是语法糖,将导致和 的有效isDefinedAt定义apply。如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
  }
}
于 2013-07-23T09:43:34.390 回答
0

isDefinedAt不是守卫:每当您调用PartialFunction.

在您的第一种情况下,MatchError由于模式匹配失败而发生。实际上,您可以在Scala 规范Partialfunction的第 8.5 节中了解第一种情况下是如何构建的。

在第二种情况下, apply 是为 allx定义的,然后您的定义isDefinedAt是无效的。

于 2013-07-23T09:50:45.343 回答