私はKotlinでRESTfulなアプリケーションを開発していますが、ルーターでは最も読みやすく見栄えの良い条件文であるため、whenステートメントを使用しています。Kotlinのwhen文の正規表現またはワイルドカード
文字列のwhen文にRegexまたはワイルドカードを使用する方法はありますか?
when(uri) {
"some/url" -> return SomeController(config).someAction(session)
}
私はKotlinでRESTfulなアプリケーションを開発していますが、ルーターでは最も読みやすく見栄えの良い条件文であるため、whenステートメントを使用しています。Kotlinのwhen文の正規表現またはワイルドカード
文字列のwhen文にRegexまたはワイルドカードを使用する方法はありますか?
when(uri) {
"some/url" -> return SomeController(config).someAction(session)
}
はい:
次のように私のルータの構造がある
(のような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
を汎用のWhenArgument
とWhenArgumentDecorator
に生成することができます。when
正規表現でカスタムの "一致"条件を指定することができます。 。
1. "/ article/get /"にはワイルドカードがありませんので、あなたの質問を理解するのが少し難しくなります。 (つまり、どのような種類のURIマッチングが本当に必要なのか/必要なのでしょうか?)2. RESTfulなAPIに "get"のような動詞を置くのは、一般的に面倒です。 HTTPメソッドは動詞であり、リソースは動詞に関係なく同じアドレスで参照可能でなければなりません。 3.ルーティングを組み込んだRESTfulフレームワークの使用を検討しましたか?例えばジャージー。 – mfulton26