我是一个绝对的Scala新手。因此,这个问题非常简单,希望有人能够理解所要求的内容。
在进行实验时,我看到我可以使用以下代码创建PartialFunction实例:
val p : PartialFunction[Int, String] = {case x if x > 2 => s"x is ${x.toString}"}
我的问题:如何从函数{case x if x > 2 => s"x is ${x.toString}"}
创建具体的PartialFunction [Int,String]?
特别是,此功能如何提供两者 ...
isDefinedAt(x: Int): Boolean
方法定义..和..
apply(v1: Int): String
方法定义..具体的PartialFunction [Int,String]必须有?
在幕后,{case x if x > 2 => s"x is ${x.toString}"}
被转变为?:
val p : PartialFunction[Int, String] = new PartialFunction[Int, String] {
override def apply(v1: Int): String = {
v1 match {
case x if x > 2 => s"x is ${x.toString}"
}
}
override def isDefinedAt(x: Int): Boolean = {
x match {
case x if x > 2 => true
case _ => false
}
}
}
答案 0 :(得分:1)
权威答案可以在the Scala language specification中找到:
8.5模式匹配匿名函数
匿名函数可以由一系列案例定义
{ case p1 => b1 … case pn => bn }
显示为没有先前匹配的表达式。必须部分地定义这种表达式的预期类型。对于某些k,它必须是
scala.Functionk[S1,…,Sk, R]
。 0或scala.PartialFunction[S1, R]
,其中必须完全确定参数类型S1,…,Sk
,但结果类型R
可能未确定。...
如果期望的类型是
scala.PartialFunction[S, R]
,则表达式将等同于以下实例创建表达式:new scala.PartialFunction[S, T] { def apply(x: S): T = x match { case p1 => b1 … case pn => bn } def isDefinedAt(x: S): Boolean = { case p1 => true … case pn => true case _ => false } }
此处,
x
是一个新名称,T
是所有bi
类型的弱最小上限。如果其中一个模式isDefinedAt
已经是变量或通配符模式,则省略p1,…,pn
方法中的最终默认情况。