以下は、smeタスクを実行すると予想されるが、異なる方法で定義される2つの部分関数である。リフト機能を直接適用すると期待された機能を持たない
val pf1 : PartialFunction[String, String] = {
case s : String if (s != null) => s.toUpperCase()
}
//> pf1 : PartialFunction[String,String] = <function1>
val lift1 = pf1.lift
//> lift1 : String => Option[String] = <function1>
val d1 = lift1(null)
//> d1 : Option[String] = None
val d2 = lift1("hello world")
//> d2 : Option[String] = Some(hello world)
val pf2 = PartialFunction[String, String] {
case s : String if(s != null) => s.toUpperCase()
}
//> pf2 : PartialFunction[String,String] = <function1>
val lift2 = pf2.lift
//> lift2 : String => Option[String] = <function1>
val d3 = lift2(null)
//> scala.MatchError: null
val d4 = lift2("hii")
//> d4 : Option[String] = Some(hii)
なぜlift2にnullを渡すと、lift1とlift2両方の定義が同じであるとき、MatchErrorを与えますか?
/** Converts ordinary function to partial one
* @since 2.10
*/
def apply[A, B](f: A => B): PartialFunction[A, B] = { case x => f(x) }
だから、それはすべてのドメインで定義されている一部の機能に正常な機能をラップ:あなたはPartialFunction.apply
を見れば
Jeez、guys、comment _the difference_私は10分を 'if'と' ''の間の空白を見つめて、それがなぜ重要なのかを調べようとしました。(他の人の手がかり、重要な型宣言の後の '= 'です。 – Malvolio