因此,假设我想为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}