带有isDefinedA和apply的Scala PartialFunction不工作

带有isDefinedA和apply的Scala PartialFunction不工作,scala,partialfunction,Scala,Partialfunction,我是Scala新手,我在尝试部分功能,这是测试功能的正确方法吗,因为一些教程遵循这一点工作,但不适合我 代码: 为什么applyget call与第一个条件不匹配? 当我写入def isDefinedAt(q:Int)=q!=0它根据以下公式给出println(r(0))作为输出0: 在调用apply之前,调用方有责任调用isDefinedAt 让我们在自动调用isDefinedAt()的上下文中尝试您的r()分部函数 val r = new PartialFunction[Int, Int]

我是Scala新手,我在尝试部分功能,这是测试功能的正确方法吗,因为一些教程遵循这一点工作,但不适合我

代码:

为什么
apply
get call与第一个条件不匹配?
当我写入
def isDefinedAt(q:Int)=q!=0
它根据以下公式给出
println(r(0))
作为输出
0

在调用
apply
之前,调用方有责任调用
isDefinedAt

让我们在自动调用
isDefinedAt()
的上下文中尝试您的
r()
分部函数

val r = new PartialFunction[Int, Int] {
  def isDefinedAt(q: Int) = q < 0
  def apply(q: Int) = 12 * q
}
List(4,-3,22,-9,0).collect(r)
//res0: List[Int] = List(-36, -108)
val r=新的部分函数[Int,Int]{
def isDefinedAt(q:Int)=q<0
def应用(q:Int)=12*q
}
列表(4,-3,22,-9,0)。收集(r)
//res0:List[Int]=List(-36,-108)

似乎像预期的那样起作用。

这不完全是你所要求的,但我认为值得一提的是它的存在。如果以后您计划编写以下代码:

if(r.isDefinedAt(1)) r(1) else 10
最好使用
applyOrElse
,如文档中所述:

请注意,表达式
pf.applyOrElse(x,默认值)
等效于

if(pf isDefinedAt x) pf(x) else default(x)
除了
applyOrElse
方法可以更有效地实现之外。对于所有的部分函数文本,编译器生成一个applyOrElse实现,以避免对模式匹配器和保护进行双重计算。这使得applyOrElse成为许多操作和场景高效实现的基础


是的,我接受了答案,谢谢
if(r.isDefinedAt(1)) r(1) else 10
if(pf isDefinedAt x) pf(x) else default(x)