调用解构声明初始值设定项的“component1()”函数所需的值不可为空

Die*_*rin 7 nullable destructuring kotlin

是否可以使以下代码在 Kotlin 中编译?

val variable: String? = "string"

val (a, b) = variable?.run {
    1 to 2
}  
Run Code Online (Sandbox Code Playgroud)

hot*_*key 15

编译器不允许解构,因为右侧的表达式被键入为 nullable Pair<Int, Int>?,并且不清楚在为 null 的情况下应该获得什么值a和。bvariable

要解决这个问题,您需要在 后获取一个非空表达式=

有很多不同的方法来处理可为空值并从可为空值生成非空值,请参阅:在 Kotlin 中,处理可为空值、引用或转换它们的惯用方法是什么

例如,如果您想为a和提供后备值b,请?:按如下方式使用运算符:

val (a, b) = variable?.run {
    1 to 2
} ?: (0 to 0)
Run Code Online (Sandbox Code Playgroud)

例如,另一种方法是variable首先检查 null:

val (a, b) = checkNotNull(variable) { "variable should never be null" }.run {
    1 to 2
}
Run Code Online (Sandbox Code Playgroud)


Ten*_*r04 6

Null 没有任何解构声明。如果您希望 null 值像一对 null 一样解构,您可以添加以下扩展:

operator fun <T> Pair<T, *>?.component1() = this?.component1()
operator fun <T> Pair<*, T>?.component2() = this?.component2()
Run Code Online (Sandbox Code Playgroud)

否则,正如另一个答案所示,您需要使用 Elvis 运算符提供默认值。

它不是自动的,因为它不知道你想要什么。根据您要使用它做什么,0 to 0可能是最合适的,或者可能-1 to -1是 或0 to nullnull to null