Kotlin 调用';组件1()';声明初始值设定项的解构功能
可以在Kotlin中编译以下代码吗Kotlin 调用';组件1()';声明初始值设定项的解构功能,kotlin,nullable,destructuring,Kotlin,Nullable,Destructuring,可以在Kotlin中编译以下代码吗 val variable: String? = "string" val (a, b) = variable?.run { 1 to 2 } 编译器不允许解构,因为右侧的表达式被键入为可为null的对?,并且不清楚变量为null时a和b应该得到什么值 要解决此问题,需要在=之后获得一个非空表达式 有很多不同的方法来处理可空值,并从可空值生成非空值,请参见: 例如,如果要为a和b提供回退值,请使用?:运算符,如下所示: val (a, b) =
val variable: String? = "string"
val (a, b) = variable?.run {
1 to 2
}
编译器不允许解构,因为右侧的表达式被键入为可为null的
对?
,并且不清楚变量为null时a
和b
应该得到什么值
要解决此问题,需要在=
之后获得一个非空表达式
有很多不同的方法来处理可空值,并从可空值生成非空值,请参见:
例如,如果要为a
和b
提供回退值,请使用?:
运算符,如下所示:
val (a, b) = variable?.run {
1 to 2
} ?: (0 to 0)
val (a, b) = variable?.run {
1 to 2
}.exitIfNull {
return
}
例如,另一种方法是首先检查变量是否为空:
val (a, b) = checkNotNull(variable) { "variable should never be null" }.run {
1 to 2
}
编译器不允许解构,因为右侧的表达式被键入为可为null的对?
,并且不清楚变量为null时a
和b
应该得到什么值
要解决此问题,需要在=
之后获得一个非空表达式
有很多不同的方法来处理可空值,并从可空值生成非空值,请参见:
例如,如果要为a
和b
提供回退值,请使用?:
运算符,如下所示:
val (a, b) = variable?.run {
1 to 2
} ?: (0 to 0)
val (a, b) = variable?.run {
1 to 2
}.exitIfNull {
return
}
例如,另一种方法是首先检查变量是否为空:
val (a, b) = checkNotNull(variable) { "variable should never be null" }.run {
1 to 2
}
Null没有任何解构声明。如果希望null值像一对null值一样进行分解,可以添加以下扩展:
operator fun <T> Pair<T, *>?.component1() = this?.component1()
operator fun <T> Pair<*, T>?.component2() = this?.component2()
运算符乐趣对?.component1()=此?.component1()
运算符乐趣对?.component2()=此?.component2()
否则,正如另一个答案所示,您需要使用Elvis操作符提供默认值
它不是自动的,因为它不知道你想要什么。根据您使用它的方式,0到0
可能是最合适的,或者-1到-1
或者0到null
或者null到null
null没有任何解构声明。如果希望null值像一对null值一样进行分解,可以添加以下扩展:
operator fun <T> Pair<T, *>?.component1() = this?.component1()
operator fun <T> Pair<*, T>?.component2() = this?.component2()
运算符乐趣对?.component1()=此?.component1()
运算符乐趣对?.component2()=此?.component2()
否则,正如另一个答案所示,您需要使用Elvis操作符提供默认值
它不是自动的,因为它不知道你想要什么。根据您使用它的方式,0到0
可能是最合适的,或者-1到-1
或者0到null
或者null到null
问题是,如果变量为null,您想怎么做?如果要引发异常,请按照@hotkey的建议使用require
或check
但是,如果值为null,我只想返回。因此,我为自己编写了一个小助手函数,它允许:
private inline fun <T> T?.exitIfNull(exitBlock: () -> Nothing): T {
if (this == null)
exitBlock()
else
return this
}
Kotlin中Nothing
关键字的一个很好的小用法,我个人觉得它非常迷人问题是,如果变量为null,您想做什么?如果要引发异常,请按照@hotkey的建议使用require
或check
但是,如果值为null,我只想返回。因此,我为自己编写了一个小助手函数,它允许:
private inline fun <T> T?.exitIfNull(exitBlock: () -> Nothing): T {
if (this == null)
exitBlock()
else
return this
}
Kotlin中Nothing
关键字的一个很好的小用法,我个人觉得它非常吸引人我认为A
和b
如果变量
为null或者我遗漏了什么,应该都为null变量
允许为null,在这种情况下,回退值应该为null。我在末尾添加了?:(null到null)
,它工作了,但我相信它可以自动完成。您实际上需要null作为Int?如果希望a
和b
为Int?
而不是Any?
,则将其设置为Int?
空值。我认为a
和b
都应该为空值,如果变量
为空值或者我缺少了什么变量
允许为null,在这种情况下,回退值应该为null。我在末尾添加了?:(null到null)
,它工作了,但我相信它可以自动完成。您实际上需要null作为Int?如果希望a
和b
为Int?
而不是Any?
,则将null设置为Int?
。如果要定义除null以外的默认值,则存在elvis运算符。我认为将null返回到null是合理的。您可以在YouTrack上打开一个问题来提出建议。它不是stdlib的一部分。我想如果有一个默认值,它必须是null到null
,因此它适用于任何类型。我认为将null返回到null是合理的。您可以在YouTrack上打开一个问题来提出建议。它不是stdlib的一部分。我想如果有一个默认值,它必须是null到null
,这样它就可以适用于任何类型。