定义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
,编译器是否应该隐式调用它?
答案 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)
}
如果要避免使用此代码,只需使用第一种方法来定义部分函数即可。这是语法糖,将导致isDefinedAt
和apply
的有效定义。如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
的定义无效。