В чем причина использования запечатанных классов, когда выражение ведет себя по-разному, если оно используется как выражение, а не как выражение? - PullRequest
0 голосов
/ 05 ноября 2019

Если вы используете запечатанные классы с when, угрозами Котлина when иначе, если вы используете его как выражение, чем если вы используете его как выражение .

Например, этофрагмент кода, когда я использую when в качестве утверждения, действителен:

sealed class SomeType
object Foo: SomeType()
object Bar: SomeType()

fun test(input: SomeType) {
    when(input) {
        is Foo -> {}
    }
}

Но этот, когда я использую его как выражение, не потому, что when ожидает либо ветвь else, либо чтокод проверяет все подтипы SomeType, где в примере кода отсутствует Bar:

sealed class SomeType
object Foo: SomeType()
object Bar: SomeType()

fun test(input: SomeType) {
    var result = when(input) {
        is Foo -> {}
    }
}

В чем причина этого решения по проекту?

И мой вопрос: чтоесли мне плевать на результат (я не хочу использовать when в качестве выражения), просто хочу выполнить код, который возвращает Unit для каждой ветви when, но я хочу иметь поведение, при котором Kotlin будетвыдает ошибку во время компиляции, если я не использовал все подтипы запечатанного класса в операторе when? Единственный вариант - использовать фиктивную переменную, поэтому я заставляю выражение when быть выражением, даже если мне плевать на результат? Любой другой способ добиться такого поведения (проверка во время компиляции, если проверены все случаи), возможно без when?

1 Ответ

0 голосов
/ 05 ноября 2019

Kotlin - это язык со строгой типизацией, который вынуждает вас объявить тип точно при объявлении значения.

Techopedia :

Строго типизированный - это понятие, используемое для обозначения языка программирования, который налагает строгие ограничения на смешивание значений с различными типами данных. Когда такие ограничения нарушаются и возникает ошибка (исключение).

В вашем первом случае when является оператором , что практически означает, что если применимо какое-либо условие, оновыполняется, если нет - игнорируется. Впоследствии с этим оператором ничего не происходит.

Во втором случае when является выражением , которое создает значение - оно может определять тип самостоятельно, только когда охвачены все условия, включаяelse.

Документация Kotlin говорит:

Если , когда используется в качестве выражения, else ветвление является обязательным, если только компилятор не может доказать, что все возможные случаи покрыты условиями ветвления

То же самое относится к If / else:

Так же, как с если , каждая ветвь может быть блоком, а его значением является значение последнего выражения в блоке.

val result1 = if(true) 1 //will not compile
val result2 = if(true) 1 else 2 // will compile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...