Почему бы check (), require () и assert () не привели к умному приведению? - PullRequest
0 голосов
/ 06 ноября 2018

Рассмотрим следующий фрагмент кода:

object C {
    @JvmStatic
    fun main(vararg args: String) {
        val s: String? = null
        check(s != null) {
            "The string is null"
        }
        require(s != null) {
            "The string is null"
        }
        assert(s != null) {
            "The string is null"
        }
        s.length
    }
}

В то время как check() и require() имеют

contract {
    returns() implies value
}

в их теле, приведенный выше код по-прежнему не компилируется, заставляя меня использовать либо ?.:

s?.length

или !!:

s!!.length

Почему в приведенном выше коде не выполняется интеллектуальное приведение?

1 Ответ

0 голосов
/ 06 ноября 2018

Я недавно ответил на связанный вопрос о разнице между assert и require. TL; DR: assert не гарантирует выдачи исключения, но require есть. В версии 1.3 он также использует контракты, что означает, что если метод возвращает значение, компилятор знает, что утверждение является правильным, и он может применить смарт-приведение, если применимо.

Это объясняет, почему assert не делает этого; возвращение из утверждения не означает, что утверждение верно. С кодом, который у вас есть, он не выдаст исключение, если ea не является истиной. Assert не будет запускать умный бросок, даже с 1.3.

check и require оба запускают умное приведение на 1.3 и выше (из-за контрактов), assert не делает (нет контрактов и нет гарантии, что оно фактически выдает исключение, если условие не выполнено).

Я нашел этот пост на форумах Kotlin, спрашивающий точно, кто вы. Контакты присутствовали довольно долго, но этот пост также подтверждает мои первоначальные предположения: пока присутствуют контакты, они не были готовы . Эффективно отключен, как упоминается во втором посте. Вот почему умный актерский состав не работает.

Однако в Kotlin 1.3 контракты были освобождены. Если вы обновитесь, вы увидите, что он работает (по крайней мере, для меня).


Полная поддержка контракта была добавлена ​​в 1.3-M2 , который является предварительным выпуском для 1.3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...