因此,假设我想为PartialFunction提供一个“全部捕获”回退:

 val foo: PartialFunction[Int, String] = { case 1 => "foo" }
 val withDefault = foo orElse { _.toString }

这不会编译:missing parameter type for expanded function ((x$1) => x$1.toString)
这个:
  val withDefault = foo orElse { case x: Int => x.toString }

也不编译(相同的错误)。

这个:
val withDefault = foo orElse { (x: Int) => x.toString }

失败与type mismatch; found : Int => String; required: PartialFunction[?,?]
我能找到使它起作用的唯一方法是将整个内容清楚地说明:
val withDefault = foo orElse PartialFunction[Int, String] { _.toString }

有没有更好的语法呢?我的意思是,不必告诉我我正在将一个部分函数从int传递到字符串,并将其传递给它希望从in接收到部分函数的地方。这根本不是模棱两可的,为什么我必须这样做?

最佳答案

也许您需要applyOrElse:

val withDefault = foo.applyOrElse(_: Int, (_: Int).toString)

也许您想要这样的事情:
implicit class PartialFunToFun[A,B](val f: PartialFunction[A,B]) extends AnyVal {
  def withDefault(bar: A => B) = f.applyOrElse[A,B](_: A, bar)
}

并使用它:foo.withDefault(_.toString)(1)
另外,如果只想获取另一个PartialFunction,则可以使用以下语法:
val withDefault = foo.orElse[Int, String]{case x => x.toString}

09-13 04:09