2016-04-25 3 views
1

Warum ist es nicht möglich, Ausdrücke in case-Anweisungen zu platzieren? :scala: nicht möglich, auf Wertausdrücke zu passen?

x match { 
    case <VALUE EXPR> => {} 
    } 

Zum Beispiel

x match { 
    case (1+2) => {} 
    } 

ist nicht erlaubt, aber

val someval = (1+new java.util.Random().nextInt()) 

    x match { 
    case someval => {} 
    } 

ist. Es scheint, dass wenn der zweite Fall erlaubt ist, auch der erste.

Ich versuche, eine Liste der Zuordnungen wie folgt hinzuzufügen:

val typ:Type = symbol.typeSignature 

    typ match { 
    case typeOf[collection.immutable.List[Any]] => { return a function to handle this type } 
    case typeOf[...] => {} 
    case typeOf[...] => {} 
    ... many 
    } 
+2

Beachten Sie, dass 'Fall someval' nicht tut, was Sie erwarten, es wird alles akzeptiert, weil es eine neue schafft Variable. Um dies zu ändern, müssen Sie den Variablennamen groß schreiben oder ihn mit Backticks umgeben. –

Antwort

7

Es trotzt einfach die Definition von Muster in Pattern-Matching.

Vom Scala Language Specification, Kapitel 8:

ist ein Muster aus Konstanten gebaut, Konstrukteure, Variablen und Typprüfungen

„Ausdrücke“ ist in dieser Liste, und das macht einen Sinn - darüber nachdenken - wann wird dieser Ausdruck bewertet? Was, wenn es Nebenwirkungen hat, wird es ausgewertet, selbst wenn ein Fall davor verwendet wurde, um das Ergebnis zurückzugeben?

Eine gültige Problemumgehung wird mit einem guard, die ausgewertet ist:

x match { 
    case i if i == (1+2) => {} // works as expected... 
} 
+0

thx fr räum das auf :) –

Verwandte Themen