【问题标题】:Scala PartialFunction with isDefinedA and apply not working带有isDefinedA的Scala PartialFunction和应用不起作用
【发布时间】:2021-02-05 06:17:28
【问题描述】:

我是 Scala 的新手,我正在尝试 PartialFunctions,这是测试功能的正确方法吗,因为一些教程遵循了这个方法,但对我不起作用?

代码:

object MyScalaApp extends App {
def try29{
    val r = new PartialFunction[Int, Int]  
    { 
        def isDefinedAt(q: Int) = q < 0 // Applying isDefinedAt method  
        def apply(q: Int) = 12 * q // Applying apply method 
    }        
    val rr = new PartialFunction[Double, Double]  
    { 
        def isDefinedAt(q: Double) = {q < 0}
        def apply(q: Double) = 12 * q 
    }

    println(r(1))
    println(r(2))        
    println(rr(-1))
    println(rr(-2))
  }
  }
  try29
}

输出:

12
24
-12.0
-24.0

为什么apply 不匹配第一个条件时会被调用?
当我写def isDefinedAt(q: Int) = q != 0 时,它给出println(r(0)) 作为输出0

【问题讨论】:

    标签: scala partialfunction


    【解决方案1】:

    根据ScalaDocs page

    调用者有责任在调用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)
    

    似乎按预期工作。

    【讨论】:

      【解决方案2】:

      这不是你问的,但我认为值得一提的是applyOrElse的存在。如果以后您打算编写代码,例如:

      if(r.isDefinedAt(1)) r(1) else 10
      

      最好使用applyOrElse,如文档中所述:

      注意表达式pf.applyOrElse(x, default) 等价于

      if(pf isDefinedAt x) pf(x) else default(x)
      

      除了applyOrElse 方法可以更有效地实现。对于所有部分函数文字,编译器生成一个 applyOrElse 实现,以避免对模式匹配器和守卫进行双重评估。这使得 applyOrElse 成为许多操作和场景高效实施的基础。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        • 2012-11-18
        • 1970-01-01
        相关资源
        最近更新 更多