Kotlin - Elvis 运算符的不当行为
Kotlin - Elvis Operator misbehavior
当 Elvis Operator ?:
不当行为时遇到了一个有趣的案例。
想象一下这样的事情
base64ToBmp(str)?.let { <1> } ?: run { <2> }
并看到在一些旧手机和模拟器上调用了 <1>
和 <2>
代码。
<1>
正在显示位图
<2>
显示错误
这就像位图解析失败一样。
有人见过这样的行为吗?有合理的解释吗?
let
returns指定功能块的值。
所以合乎逻辑的解释是<1>
returns null
。在这种情况下,整个表达式 base64ToBmp(str)?.let { <1> }
变为 null
并且 elvis 运算符的右侧(即 run { <2> }
)将被计算。
一种非常简单的复制方法是:
"foo"?.let { print("<1>"); null } ?: print("<2>")
// Prints <1><2>
根据您的实际用例,apply
or also
(return 上下文对象本身)可能是合适的(请注意,对于 apply
,对象引用作为 this
而不是 it
):
"foo"?.apply { print("<1>"); null } ?: print("<2>")
// Prints <1>
@Marvin 的回答是正确的,如果你想重现这个场景你可以试试这段代码:
fun main() {
fun someMethod(param: String?) = param
fun letBlock(param: String): String? {
println("<1>")
return null
}
someMethod("some param")?.let(::letBlock) ?: run {
println("<2>")
}
}
输出为:
<1>
<2>
当 Elvis Operator ?:
不当行为时遇到了一个有趣的案例。
想象一下这样的事情
base64ToBmp(str)?.let { <1> } ?: run { <2> }
并看到在一些旧手机和模拟器上调用了 <1>
和 <2>
代码。
<1>
正在显示位图<2>
显示错误
这就像位图解析失败一样。
有人见过这样的行为吗?有合理的解释吗?
let
returns指定功能块的值。
所以合乎逻辑的解释是<1>
returns null
。在这种情况下,整个表达式 base64ToBmp(str)?.let { <1> }
变为 null
并且 elvis 运算符的右侧(即 run { <2> }
)将被计算。
一种非常简单的复制方法是:
"foo"?.let { print("<1>"); null } ?: print("<2>")
// Prints <1><2>
根据您的实际用例,apply
or also
(return 上下文对象本身)可能是合适的(请注意,对于 apply
,对象引用作为 this
而不是 it
):
"foo"?.apply { print("<1>"); null } ?: print("<2>")
// Prints <1>
@Marvin 的回答是正确的,如果你想重现这个场景你可以试试这段代码:
fun main() {
fun someMethod(param: String?) = param
fun letBlock(param: String): String? {
println("<1>")
return null
}
someMethod("some param")?.let(::letBlock) ?: run {
println("<2>")
}
}
输出为:
<1>
<2>