2016-03-20 9 views
3

以下は、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を見れば

+0

Jeez、guys、comment _the difference_私は10分を 'if'と' ''の間の空白を見つめて、それがなぜ重要なのかを調べようとしました。(他の人の手がかり、重要な型宣言の後の '= 'です。 – Malvolio

答えて

1

、あなたはそれはあなたが期待した内容その後、異なるビットの何かをしていることがわかります。あなたが持ち上げるとき、あなたは例外を受け取り、なぜそれがだ - 内部が正常でない、持ち上げられた部分関数がまだあるので、それは、lift2にnullを渡すのはなぜ

0

MatchErrorが与えると定義されていない場合 両方lift1とlift2の定義と同じ?

これらは同じものではありません。あなたが定義する場合:

val pf1: PartialFunction[String, String] = { 
    case s : String if (s != null) => s.toUpperCase() 
} 

をコンパイラはこのように、PartialFunctionを作成します。

this.pf1 = ({ 
    new <$anon: Function1>() 
    }: PartialFunction); 

しかし、あなたはこのようにpf2を宣言する場合:

val pf2 = PartialFunction[String, String] { 
    case s : String if(s != null) => s.toUpperCase() 
} 

あなたは実際には "コンパイラを言っていますこれをFunction1とし、PartialFunction.applyに渡してください。そのため、コンパイラはこれを行います:

this.pf2 = scala.PartialFunction.apply({ 
    (new <$anon: Function1>(): Function1) 
}); 

実際にはFunction1を部分的な機能の中にラップします。したがって、pf2.lift(null)に電話すると、Function1が内部で呼び出され、表示されているとおりMatchErrorになります。

関連する問題