2010-03-09 15 views
13

Grundsätzlich möchte ich in der Lage sein, einen benutzerdefinierten Extraktor zu erstellen, ohne ihn vor der Verwendung in einer Variablen speichern zu müssen.Können Extraktoren mit Parametern im Körper einer case-Anweisung (oder anderswo, wo ein Extraktor verwendet würde) angepasst werden?

Dies ist kein echtes Beispiel, wie ich es verwenden würde, es würde eher im Falle eines regulären Ausdrucks oder eines anderen String-Patterns wie Konstrukt verwendet werden, aber hoffentlich erklärt es, wonach ich suche:

def someExtractorBuilder(arg:Boolean) = new { 
    def unapply(s:String):Option[String] = if(arg) Some(s) else None 
} 

//I would like to be able to use something like this 
val {someExtractorBuilder(true)}(result) = "test" 
"test" match {case {someExtractorBuilder(true)}(result) => result } 

//instead I would have to do this: 
val customExtractor = someExtractorBuilder(true) 
val customExtractor(result) = "test" 
"test" match {case customExtractor(result) => result} 

wenn nur einen einzigen benutzerdefinierten Extraktor tut es nicht viel Unterschied machen, aber wenn Sie eine große Liste von Extraktoren für eine Case-Anweisung erstellt wird, könnte es Dinge schwieriger machen, indem zu lesen alle die Trenn Extraktoren aus ihrer Verwendung.

Ich erwarte, dass die Antwort nein ist, dass Sie dies nicht tun können, aber ich dachte, ich würde fragen, um erste: D

+0

Und hast du, äh, * versuchst du es? –

+0

Ich habe versucht, es erhielt ich einen Syntaxfehler: scala> val {someExtractorBuilder (true)} (Ergebnis) = "test" : 1: Fehler: illegal Anfang einfacher Muster val {someExtractorBuilder (true)} (Ergebnis) = "Test" ^ –

+0

Was versuchen Sie letztendlich? Es gibt wahrscheinlich einen besseren Weg, um viele Extraktoren zu machen. –

Antwort

2

Nope.

8.1.7 Extractor Patterns

An extractor pattern x (p 1 , . . . , p n) where n ≥ 0 is of the same syntactic form as a constructor pattern. However, instead of a case class, the stable identifier x denotes an object which has a member method named unapply or unapplySeq that matches the pattern.

7

Parametrierset Extraktoren wäre cool, aber wir haben nicht die Mittel zu deren Umsetzung jetzt.

+1

Danke, dass du diese Art von Fragen im Auge behalten hast :-) – Lutz

1

Eine Extraktoren in gewissem Umfang mit impliziten Parameter anpassen können, wie folgt aus:

Leider kann dies nicht verwendet werden, wenn Sie verschiedene Varianten in einem match verwenden möchten, wie alle case Anweisungen sind im selben Umfang. Trotzdem kann es manchmal nützlich sein.