Настройка Kotlin при выражении

Я действительно новичок в Kotlin, и то, что я хочу, это что-то вроде:

when_assert_no_else { CONDITION0 -> { doSomething0() } CONDITION1 -> { doSomething1() } } 

который работает так же, как

 when { CONDITION0 -> { doSomething0() } CONDITION1 -> { doSomething1() } else -> { throw RuntimeException() } } 

Последний фрагмент кода обнаруживает много времени в моем проекте, и я хочу утверждать, что поток управления не достигает блока else , бросая исключение.

Или, можно ли настроить ключевое слово, предоставив реализацию when_assert_no_else ?

Любая идея, пожалуйста? Спасибо.

Вы не можете написать код выше, поскольку оператор kotlin не имеет -> , но вы можете сделать некоторые компромиссы, например: вместо этого используйте Pair<()->Boolean,()->T> .

 fun test(): Int = when_assert_no_else( { true } to { 1 }, { false } to { 2 } ) fun <T> when_assert_no_else(vararg cases: Pair<() -> Boolean, () -> T>): T { // v--- short-circuiting terminal operation return cases.find{ it.first() } .let { it ?: throw RuntimeException() } .second() } 

Я также подумал о решении holi-java, но может не хватить всех сценариев. Рассмотрим, например, побочные эффекты в ветвях.

То, что вы могли бы сделать, – это «абстрагировать» другую ветвь. Я имею в виду, что вы создаете (статический) класс и добавляете метод when_assert_else . В методе _when_assert_else_ вы добавляете код, который вы должны выполнить в ветке else тогда, когда. Преимущество вашей текущей стратегии состоит в том, что, когда вы хотите изменить ветку else, вам придется пройти весь свой код и изменить его x раз. С вызовом функции вы могли бы изменить его только один раз.

Intereting Posts
Как плоская карта над списком объектов, которые могут иметь пустую коллекцию В тестовом пакете не читаются классы Котлина, определенные в основном пакете Почему я не могу использовать интерфейс как общий тип в этом Rx-трансформаторе? как реализовать Switch, используя привязку данных в android Ожидается ли, что я могу вызвать функцию с объектом-приемником, передав объект-приемник в качестве первого аргумента? Получение ссылки на функцию Kotlin как метод Java Могу ли я использовать kotlin.reflect, чтобы получить значение поля Настройка прослушивателей Android в Kotlin – использование возврата в lambdas Могу ли я написать sampleVideoView? = findViewById <VideoView> (R.id.videoView) в Котлине? Lint сбой на классе Java, читающий объект Kotlin Как вызвать функцию в другом классе Как назначить байт в котлин? убедитесь, что метод kotlin является статическим, верхним или аннотированным @JvmStatic FirebaseListAdapter игнорирует orderByChild () и equalTo () Ошибка перегрузки Ошибка в котлине