创建PartialFunction

时间:2017-10-27 12:02:32

标签: scala

我是一个绝对的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
    }
  }
}

1 个答案:

答案 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方法中的最终默认情况。