PartialFunction和MatchError

时间:2013-07-23 09:23:02

标签: scala partialfunction

定义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,编译器是否应该隐式调用它?

2 个答案:

答案 0 :(得分:2)

您必须使用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)
}

如果要避免使用此代码,只需使用第一种方法来定义部分函数即可。这是语法糖,将导致isDefinedAtapply的有效定义。如Scala language specification中所述,您的第一个定义将扩展为以下内容:

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

答案 1 :(得分:0)

isDefinedAt不是警卫:只要您拨打PartialFunction,就不会进行检查。

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

在第二种情况下,为所有x定义了应用,然后您对isDefinedAt的定义无效。