2016-12-21 5 views
3

Ich arbeite an einer RESTful App in Kotlin und für den Router, verwende ich eine When-Anweisung, da es die am besten lesbare und gut aussehende Bedingung ist.Regex oder Wildcard in Kotlins When-Anweisung?

Gibt es eine Möglichkeit, Regex oder einen Platzhalter in der When-Anweisung für eine Zeichenfolge zu verwenden?

(So, dass URIs wie "/ article/get /" alle an demselben Controller übergeben werden würde)

Die Struktur meines Routers ist wie folgt:

when(uri) { 
    "some/url" -> return SomeController(config).someAction(session) 
} 
+0

1. Es gibt keinen Platzhalter in "/ article/get /", also stimmt es nur mit sich selbst überein, was es schwierig macht, Ihre Frage zu verstehen. (d. h. welche Art von URI-Übereinstimmung möchten Sie wirklich/brauchen?) 2. Das Setzen von Verben wie "get" in RESTful-APIs ist normalerweise verpönt; Die HTTP-Methoden sind die Verben und Ressourcen sollten unabhängig vom Verb mit der gleichen Adresse referenzierbar sein. 3. Haben Sie darüber nachgedacht, ein RESTful-Framework mit integriertem Routing zu verwenden? z.B. Jersey. – mfulton26

Antwort

3

Ja.

import kotlin.text.regex 

val regex1 = Regex(/* pattern */) 
val regex2 = Regex(/* pattern */) 
/* etc */ 

when { 
    regex1.matches(uri) -> /* do stuff */ 
    regex2.matches(uri) -> /* do stuff */ 
    /* etc */ 
} 

Sie könnten auch containsMatchIn verwenden, wenn das Ihren Bedürfnissen entspricht besser als matches.

Erläuterung:

Der Testausdruck einer when Anweisung ist optional. Wenn kein Testausdruck enthalten ist, funktioniert die when-Anweisung wie eine if-else if-Kette, wobei die whenCondition von jedem whenEntry unabhängig zu einem booleschen Wert ausgewertet werden soll.


EDIT:

Also dachte ich über sie für eine Weile, und ich kam mit einem anderen Ansatz auf, die näher sein könnte, was Sie wollen.

import kotlin.text.regex 

when (RegexWhenArgument(uri)) { 
    Regex(/* pattern */) -> /* do stuff */ 
    Regex(/* pattern */) -> /* do stuff */ 
    /* etc */ 
} 

Wo RegexWhenArgument minimal wie folgt definiert ist:

class RegexWhenArgument (val whenArgument: CharSequence) { 
    operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument) 
    override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry) 
} 

Dieser Ansatz lässt Sie so nah wie möglich an das "Argument-ful" when Ausdruck Syntax. Ich denke, es ist so gestrafft und lesbar wie es sein kann (vorausgesetzt, dass Sie die Klasse RegexWhenArgument woanders definieren).

Dieser Ansatz nutzt etwas ähnliches wie die Besucher-Entwurfsmuster in Kombination mit Kotlin des Bedieners neu zu definieren, was eine Überlastung zwischen einem when Argumente Ausdruck und einem whenEntry eine „Übereinstimmung“ darstellt. Wenn Sie wirklich wollten, könnten Sie diesen Ansatz vielleicht einen Schritt weiterführen und RegexWhenArgument in einen allgemeinen Zweck WhenArgument und WhenArgumentDecorator generalisieren, mit dem Sie benutzerdefinierte "Übereinstimmungs" -Kriterien in einem when Ausdruck für jede Art von Typ angeben können, nicht nur Regex .

+0

Danke Kumpel! Das ist nicht perfekt, aber ich denke, es ist die beste Option für mich im Moment. –

+0

@JacobS Sie können anonyme Instanzen von 'Regex' verwenden, wenn Sie nicht möchten, dass das Muster visuell von der' return SomeController'-Logik getrennt wird, sondern dass innerhalb des 'when' Blocks viel horizontaler Zeilenabstand benötigt wird ... – Travis

+0

@JacobS.Ich habe gerade einen anderen Ansatz bearbeitet, der näher an dem ist, wonach Sie suchen ... – Travis