2016-12-21 1 views
3

나는 Kotlin에서 RESTful 앱을 만들고 라우터를 위해 최선의 읽기 쉽고 조건이 좋은 조건문 인 when 문을 사용하고있다.Kotlin의 when 문에서 정규식 또는 와일드 카드?

문자열의 when 문에 Regex 또는 와일드 카드를 사용하는 방법이 있습니까?

을 (같은 URI를 "/ 문서// GET"모두 같은 컨트롤러에 전달 될 것이다 그래야) 다음과 같이

내 라우터의 구조는 다음과 같습니다

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

1. "/ article/get /"에는 와일드 카드가 없으므로 자신 만 일치하므로 질문을 이해하기가 어렵습니다. (즉, 어떤 종류의 URI 일치가 실제로 원하는가/필요합니까?) 2. RESTful API에 "get"과 같은 동사를 넣는 것은 일반적으로 싫은 일입니다. HTTP 메소드는 동사이며 자원은 동사에 관계없이 동일한 주소로 참조 가능해야합니다. 3. 라우팅이 내장 된 RESTful 프레임 워크를 사용하는 것이 고려 되었습니까? 예 : 저지. – mfulton26

답변

3

예. 즉, 귀하의 요구에보다 나은 matches 맞는 경우

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 */ 
} 

또한 containsMatchIn를 사용할 수 있습니다.

설명 :

when 문을 시험하기위한 표현은 선택 사항입니다. 테스트 표현식이 포함되어 있지 않으면 when 문은 if-else if 체인과 같은 기능을합니다. 여기서 whenConditionwhenEntry이며 각각 부울로 평가됩니다.


는 편집 :

그래서 나는 잠시 그것에 대해 생각, 나는 당신이 원하는 가까이 할 수있는 다른 접근 함께했다. RegexWhenArgument가 최소한으로 정의된다
import kotlin.text.regex 

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

:

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

이 방법은 당신이 "인수-FUL"when 식 구문에 가능한 한 가까이 있습니다. 나는 그것이 가능할 정도로 유선형이고 읽기 쉽다고 생각한다 (여러분이 RegexWhenArgument 클래스를 다른 곳에서 정의한다고 가정 할 때).

이 접근법은 Kotlin의 연산자 오버로딩과 함께 방문객 디자인 패턴과 비슷한 것을 사용하여 when 표현식 인수와 whenEntry 사이의 "일치"를 재정의합니다. 정말로 원한다면이 접근법을 한 걸음 더 나아가서 RegexWhenArgument을 일반 용도 WhenArgumentWhenArgumentDecorator으로 생성하여 정규식뿐만 아니라 when 표현식에서 사용자 정의 "일치"조건을 지정할 수 있다고 가정합니다. .

+0

감사합니다. 이것은 완벽하지는 않지만 지금 당장 나를위한 최선의 선택이라고 생각합니다. –

+0

@JacobS 패턴을'return SomeController' 논리와 시각적으로 분리하지 않으려면'Regex'의 익명 인스턴스를 사용할 수 있습니다.하지만'when' 블록 내부에 많은 수평선 공간을 차지하기 시작할 수도 있습니다 ... – Travis

+0

@JacobS.나는 당신이 찾고있는 것과 더 가까운 다른 접근법을 편집했습니다 ... – Travis