Как я могу сообщить компилятору Kotlin, что я уже проверил нулевое значение внутри функции? - PullRequest
1 голос
/ 30 октября 2019

По сути, у меня есть функция, которая делает некоторые вещи, но, в частности, она проверяет, являются ли два значения, которые я передаю, нулевыми. Эта функция вызывается из разных мест, чтобы убедиться, что эти два значения не равны NULL. Позже Котлин жалуется, что я не проверяю на ноль. Есть ли способ, которым я могу сделать это, чтобы Kotlin уже знал, что я проверяю на null без использования !!?

Вот простой пример:

private fun stuff() {
    var possibleNull: String? = "test"
    if (testNull(possibleNull)) {
        mustPassNonNull(possibleNull)
    }
}

private fun mustPassNonNull(possibleNull: String) {
    //use value that isn't null
}

private fun testNull(possibleNull: String?): Boolean {
    return possibleNull != null
}

В основном testNull только true, если possibleNull не null и эта проверка на if прямо передПозвонив по номеру mustPassNonNull, могу ли я сообщить Котлину, что уже проверяю это? без использования !! конечно.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 30 октября 2019

Возможно с использованием контрактов . В настоящее время в экспериментальном режиме в Kotlin 1.3.

Возможно объявить контракты для ваших собственных функций, но эта функция является экспериментальной, поскольку текущий синтаксис находится в состоянии раннего прототипа и, скорее всего, будет изменен,Также обратите внимание, что в настоящее время компилятор Kotlin не проверяет контракты, поэтому программист обязан писать правильные и надежные контракты. -kotlinlang.org

@ExperimentalContracts
fun stuff() {
   var possibleNull: String? = "test"
   if (testNull(possibleNull)) {
      mustPassNonNull(possibleNull)
   }
}

fun mustPassNonNull(possibleNull: String) {
   //use value that isn't null
}

@ExperimentalContracts
fun testNull(possibleNull: String?): Boolean {
   contract{
      returns(true) implies (possibleNull is String)
   }

   return possibleNull != null
}

Статьи, на которые я ссылался:

0 голосов
/ 31 октября 2019

Это похоже на простую let ситуацию

private fun stuff() {
    var possibleNull: String? = "test"
    possibleNull?.let { mustPassNonNull(it) }
}

Таким образом, mustPassNonNull будет знать, что он не равен нулю:)

Кроме того, если вам нужно сделать больше, чем простопроверить на обнуляемость вы можете сделать:

possibleNull
    ?.takeIf { /* it's not null here anymore, add any checks you need */}
    ?.let { /* both non-null and checked for whatever you need */}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...