我试图调试为什么某些部分函数组合不起作用,当我注意到取决于您实例化部分函数的方式,您会得到不同的结果。
当您使用语法糖方法时,一切都按预期工作:
scala> val pf1:PartialFunction[Any,Unit] = {case "a" => println("AAA")}
pf1: PartialFunction[Any,Unit] = <function1>
scala> val pf2:PartialFunction[Any,Unit] = {case "b" => println("BBB")}
pf2: PartialFunction[Any,Unit] = <function1>
scala> val pf = pf1 orElse pf2
pf: PartialFunction[Any,Unit] = <function1>
scala> pf("a")
AAA
scala> pf("b")
BBB
但是,如果您使用 PartialFunction 对象,它就不再起作用了。
scala> val pf1 = PartialFunction[Any,Unit]{case "a" => println("AAA")}
pf1: PartialFunction[Any,Unit] = <function1>
scala> val pf2 = PartialFunction[Any,Unit]{case "b" => println("BBB")}
pf2: PartialFunction[Any,Unit] = <function1>
scala> val pf = pf1 orElse pf2
pf: PartialFunction[Any,Unit] = <function1>
scala> pf("a")
AAA
scala> pf("b")
scala.MatchError: b (of class java.lang.String)
at $anonfun$1.apply(<console>:7)
这是为什么?您通常会期望 Object 的 apply 方法的行为类似于 Class 的构造函数。