2012-09-04 8 views
7

Mögliche Duplizieren:
Scala: short form of pattern matching that returns BooleanHat scala einen "test-if-match" -Operator?

In meinem scala Code Ich finde mich oft Dinge wie die folgende schreiben:

x match{ 
    case Type(params) => doStuffWith(params) 
    case _ => /* do nothing*/ 
} 

Gibt es bereits einige vordefinierte Operator mach das? Ich denke, es wäre viel klarer, wenn ich Dinge schreiben könnte wie:

im Wesentlichen vermeiden die seltsame sonst Fall. Ich hatte auch andere Situationen, in denen ich feststellen konnte, ob etwas in Inline-Form zu einem Muster passt, und mir ein zusätzliches Paar Klammern ersparen würde.

Ich weiß, dass diese Art von Sache nur nützlich sein könnte, wenn mehr iterativen Code geschrieben wird, aber Scala scheint so viele versteckte Funktionen zu haben, dass ich mich frage, ob jemand eine einfache Lösung dafür hat.

+1

Haben Sie bei Extraktoren geschaut? – phant0m

+0

Viele der eingebauten Typen haben auch Prädikate dafür, wie entweder isLeft/isRight, Lists isNil, Options isNone etc – Squidly

Antwort

7

Sie könnten lift eine Teilfunktion Any-A in eine Funktion Any-Option[A].

Um die Syntax schön machen zunächst eine Hilfsfunktion definieren:

def lifted[A](pf: PartialFunction[Any,A]) = pf.lift 

Dann machen Sie Gewinn:

val f = lifted { 
    case Type(i) => doStuff(i) 
} 

scala> f(2) 
res15: Option[Int] = None 

scala> f(Type(4)) 
res16: Option[Int] = Some(8) 

Die doStuff Methode wird nur, wenn das Argument übereinstimmt aufgerufen werden. Und Sie können mehrere Fallklauseln haben.

3

Der kürzeste Weg ich denken kann, ist der Wert in einer Option zu wickeln und die Collect-Methode verwenden:

Option(x).collect { case Type(params) => doStuffWith(params) } 
3

den Link verwenden, das @ phant0m gab, es zu buchstabieren:

import PartialFunction.condOpt 

condOpt(x){ case Type(params) => doStuffWith(params) } 
0

Wenn dieses Muster oft im Code angezeigt wird, sollten Sie doSomeStuff in einem Verfahren zur Type Drehen betrachten. Fallklassen in Scala sind normale Klassen, und Sie sollten die objektorientierten Funktionen verwenden, wenn sie sinnvoll sind.

Andernfalls können Sie eine Methode an der Spitze Ihrer Hierarchie hinzufügen, vorausgesetzt, dass alle Ihre Fallklassen ein gemeinsames Merkmal erweitern. Zum Beispiel:

class Base { 
    def whenType(f: (T1, T2) => Unit): Unit = this match { 
    case Type(t1, t2) => f(t1, t2) 
    case _ =>() 
    } 
} 

und dann können Sie verwenden x whenType doSomeStuff

Verwandte Themen