https://kotlinlang.org logo
Title
e

Eugen Martynov

02/28/2019, 4:25 PM
использую такой костыль
when (...) {...} ?: Unit
g

ghedeon

02/28/2019, 4:27 PM
типа exhaustive when нужен? Вопрос как-то сумбурно составлен. https://stackoverflow.com/a/44383076/858448 https://proandroiddev.com/til-when-is-when-exhaustive-31d69f630a8b
g

gildor

02/28/2019, 4:33 PM
Из коробки ничего, только костыли пока
Есть фича реквест про это https://youtrack.jetbrains.com/issue/KT-12380
e

Eugen Martynov

02/28/2019, 4:51 PM
о, супер!
спасибо
d

Dmitry Kandalov

03/01/2019, 12:47 PM
Не уверен, что я понял вопрос, но возможно вот это пойдёт
val Unit.exhaustive get() = this
when (result) {
  ...
}.exhaustive
g

gildor

03/01/2019, 1:11 PM
Да, это один из этих самых хаков В такой имплементации проблема, что when может возвращать не только Unit
Если сделать расширением Any, то засоряет автокомплит всех типов
Я ещё использую иногда toString(), не засоряет автокомплит, но довольно сильно путает, если кто-то этот заказ не видел
d

Dmitry Kandalov

03/01/2019, 1:13 PM
Если не Unit, то
when
к чему-нибудь присваивается (или возвращается из функции) и будет exhaustive сам по себе
g

gildor

03/01/2019, 1:14 PM
Fixed
Если не Unit, то
when
к чему-нибудь присваивается
Это же не так, один из бранчей может возвращать значение которое мы не используем, только не будет Unit и что бы это исправить каждый бранч который возвращает не Unit придется каким то образом передать в Unit Вот к примеру
enum class Operation { Log, Delete }
fun log(id: String): Unit = TODO()
fun delete(id: String): Boolean = TODO()

when (case) {
    Operation.Log -> log("foo")
    Operation.Delete -> delete("bar")
}.exhaustive // Не работает так как типом этого экспрешена будет Any, а не Unit
И что бы это заработало надо передлать на нечто подобное:
when (case) {
    Operation.Log -> log("foo")
    Operation.Delete -> {
        delete("bar")
        Unit
    }
}.exhaustive
не уверен что это лучше
d

Dmitry Kandalov

03/11/2019, 12:07 PM
Если не Unit, то
when
к чему-нибудь присваивается
Я имел ввиду, что если
when
не используется для экшенов, то он обычно присваивается и будет требовать всех бранчей. Если используется для экшенов с разными типами, то да, есть проблема с Any, но в этом случае можно спорить, что надо писать код так, чтобы все экшены возвращали Unit или не игнорить результат вызова функции.
g

gildor

03/11/2019, 12:22 PM
Я согласен, но это сильно зависит от функции, к примеру есть куча валидных кейсов когда результат вполне нормально игнорировать, к примеру один из экшенов запускает корутины через launch, то в большинстве случаев Job игнорируется, понятно можно вынести в функцию, но это как раз тот доп код которого хочется избежать