Я обрабатываю строки, и я наткнулся на ответ Regex или Wildcard : можно поместить регулярные выражения в оператор when
с помощью пользовательского класса, который переопределяет equals.Хотя это эффективно использует систему типов для добавления синтаксического сахара в оператор when
, я нахожу следующее довольно уродливым и никогда не сделаю этого в коде, которым я намерен поделиться с другим разработчиком (цитируя travis ):
import kotlin.text.regex
when (RegexWhenArgument(uri)) {
Regex(/* pattern */) -> /* do stuff */
Regex(/* pattern */) -> /* do stuff */
/* etc */
}
Где RegexWhenArgument минимально определен как:
class RegexWhenArgument (val whenArgument: CharSequence) {
operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument)
override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry)
}
( конец кавычки )
Я думаю, это было бы намного большечитаемый, чтобы передать аргумент when
и затем ссылочные функции, которые работают с типом аргумента.Для надуманного примера:
// local declaration
val startsWithFn: (String) -> Boolean = {s -> s.startsWith("fn:")}
when(givenString) {
::startsWithHelp -> printHelp()
startsWithFn -> println("Hello, ${givenString.substring(3)}!")
}
// package level function
fun startsWithHelp(s:String) = s.startsWith("help", true)
Но, конечно, этот код не компилируется.Есть ли способ сделать это читабельным, понятным и лаконичным?Может быть, с помощью потоков?Что бы сделал опытный разработчик Kotlin?