2016-12-21 5 views
3

私はKotlinでRESTfulなアプリケーションを開発していますが、ルーターでは最も読みやすく見栄えの良い条件文であるため、whenステートメントを使用しています。Kotlinのwhen文の正規表現またはワイルドカード

文字列のwhen文にRegexまたはワイルドカードを使用する方法はありますか?

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

1. "/ article/get /"にはワイルドカードがありませんので、あなたの質問を理解するのが少し難しくなります。 (つまり、どのような種類のURIマッチングが本当に必要なのか/必要なのでしょうか?)2. RESTfulなAPIに "get"のような動詞を置くのは、一般的に面倒です。 HTTPメソッドは動詞であり、リソースは動詞に関係なく同じアドレスで参照可能でなければなりません。 3.ルーティングを組み込んだRESTfulフレームワークの使用を検討しましたか?例えばジャージー。 – mfulton26

答えて

3

はい:

次のように私のルータの構造がある

(のようなURI "/記事は//GET" すべて同じコントローラに渡されるようにするため)。それはあなたのニーズよりも良好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チェーンのように機能し、whenConditionの各whenEntryは独立してブール値に評価されます。


EDIT:

だから私はしばらくの間それについて考え、そして私はあなたが望むものに近いかもしれない別のアプローチを思い付きました。 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