Kotlin 调用';组件1()';声明初始值设定项的解构功能

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) =

可以在Kotlin中编译以下代码吗

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
,这样它就可以适用于任何类型。