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)
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 null或null to null。
| 归档时间: |
|
| 查看次数: |
5275 次 |
| 最近记录: |