2016-03-20 15 views
3

Unten sind die zwei Teilfunktionen aufgeführt, von denen erwartet wird, dass sie sme-Aufgaben ausführen, die jedoch auf verschiedene Arten definiert sind. direkte Anwendung der Lift-Funktion keine erwartete Funktion geben

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) 

Warum LIFT2 null vorbei gibt MatchError, wenn die Definition der beiden LIFT1 und LIFT2 gleiche ist?

+0

Jeez, Leute, kommentieren _der Unterschied_. Ich starrte 10 Minuten lang auf den weißen Zwischenraum zwischen 'if' und' s ('und versuchte herauszufinden, warum das wichtig war.) (Hinweis für alle anderen, es ist das' '' nach der Typdeklaration, die zählt. – Malvolio

Antwort

1

Wenn man sich PartialFunction.apply anschauen, werden Sie sehen, dass es funktioniert ein bisschen etwas anderes dann, was Sie erwartet haben:

/** Converts ordinary function to partial one 
    * @since 2.10 
    */ 
    def apply[A, B](f: A => B): PartialFunction[A, B] = { case x => f(x) } 

So wickelt es eine normale Funktion in Teilfunktion, die auf allen Domäne definiert ist. Und das ist, warum, wenn Sie heben Sie Ausnahme erhalten - denn innen ist immer noch eine normale nicht-gehoben Teilfunktion, die nicht

definiert
0

Warum LIFT2 null vorbei gibt MatchError, wenn die Definition von sowohl LIFT1 und LIFT2 ist gleich?

Sie sind nicht gleich definiert. Wenn Sie definieren:

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

Der Compiler erzeugt eine PartialFunction, wie folgt aus:

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

Aber wenn man erklären pf2 wie folgt aus:

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

Sie sagen tatsächlich den Compiler " Bitte nehmen Sie diese Function1 und übergeben Sie es an PartialFunction.apply.Deshalb tut der Compiler das:

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

Die tatsächlich eine Function1 innerhalb einer Teilfunktion umschließt. Also, wenn Sie pf2.lift(null) anrufen, ruft es intern die Function1, verursacht eine MatchError, wie Sie sehen.