定义 PF 有两种方法:1) 使用文字case {}语法,2) 作为显式类。我需要以下函数抛出 MatchError,但在第二种情况下不会发生。
1) 带外壳
val test: PartialFunction[Int, String] = {
case x if x > 100 => x.toString
}
Run Code Online (Sandbox Code Playgroud)
2)作为类
val test = new PartialFunction[Int, String] {
def isDefinedAt(x: Int) = x > 100
def apply(x: Int) = x.toString
}
Run Code Online (Sandbox Code Playgroud)
在秒的情况下,我应该手动调用吗?isDefinedAt编译器不应该隐式调用它吗?
您必须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)
}
Run Code Online (Sandbox Code Playgroud)
如果你想避免这段代码,你可以简单地使用第一种方法来定义你的部分函数。它是语法糖,将产生 和 的有效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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1183 次 |
| 最近记录: |