如果Elvis运算符的两个表达式求值为null,那么选择哪一个?

时间:2018-05-11 21:08:25

标签: kotlin

例如:

var str: String? = null
str ?: null

当run返回null,但是哪一个?我没有预见到任何实际目的 - 我只是好奇。

2 个答案:

答案 0 :(得分:2)

elvis运算符的工作方式如下:如果左操作数求值为null,则使用右操作数。请参阅此answer

在你的情况下,选择了右null,但是像这样使用它是完全没用的。只有在为相应的左操作数提供非null替代方法时,才使用elvis运算符。

答案 1 :(得分:2)

您正在寻找的答案是右侧值,这正是我们所期望的。它们都是空的这一事实与评估它们的顺序没有关系,Kotlin有合同并坚持下去。

如果我在编辑器中键入你的代码,我会收到一条警告:“elvis运算符的右操作数(?:)如果它为空则没用”,这对我来说似乎是正确的。为了解决这个问题,让我们用返回null的函数替换左侧和右侧......

fun alwaysReturnsNull(log: String): String? {
    println(log)
    return null
}

val str: String? = alwaysReturnsNull("first") ?: alwaysReturnsNull("second")
println(str)

在这种情况下,输出是“first”后跟“second”,表明Kotlin按照你期望的顺序评估这些函数值:elvis的左手,然后是elvis的右手。

相关问题