Не обнуляемое значение, необходимое для вызова функции component1 () инициализатора объявления деструктуризации - PullRequest
0 голосов
/ 04 марта 2020

Можно ли сделать следующий код для компиляции в Kotlin?

val variable: String? = "string"

val (a, b) = variable?.run {
    1 to 2
}  

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Null не имеет деклараций о разрушении. Если вы хотите, чтобы значение null разрушалось, как если бы это была пара нулей, вы можете добавить следующие расширения:

operator fun <T> Pair<T, *>?.component1() = this?.component1()
operator fun <T> Pair<*, T>?.component2() = this?.component2()

В противном случае, как показывает другой ответ, вам нужно указать значение по умолчанию с помощью оператора Elvis.

Это не автомат c, потому что он не знает, чего вы хотите. В зависимости от того, что вы делаете с ним, 0 to 0 может быть наиболее подходящим, или может быть -1 to -1 или 0 to null или null to null.

1 голос
/ 04 марта 2020

Компилятор не допускает деструктуризацию, потому что выражение в правой части напечатано как nullable Pair<Int, Int>?, и неясно, какие значения a и b должны получить в случае, если variable равно нулю.

Чтобы решить эту проблему, вам нужно получить ненулевое выражение после =.

Существует множество различных способов работы со значениями Nullable и получения значения NULL из значения NULL, см. В Kotlin, как идиоматический c способ работы с Обнуляемые значения, ссылки или преобразование их

Например, если вы хотите предоставить запасные значения для a и b, используйте оператор ?: следующим образом:

val (a, b) = variable?.run {
    1 to 2
} ?: (0 to 0)

Альтернативой, например, будет проверка variable на нулевое значение:

val (a, b) = checkNotNull(variable) { "variable should never be null" }.run {
    1 to 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...