fun printIt(num: Int) {
if (num < 0) {
print("负")
} else if (num > 0) {
print("正")
} else {
print("0")
}
}
fun main() {
printIt(-1)
print(",")
printIt(1)
print(",")
printIt(0)
}
大家可以猜一下打印结果。
没错,答案就是A.
好吧,接下来把代码稍作改动:
fun printIt(num: Int) {
if (num < 0) {
"负"
} else if (num > 0) {
"正"
} else {
"0"
}.let { print(it) }
}
fun main() {
printIt(-1)
print(",")
printIt(1)
print(",")
printIt(0)
}
仔细对比两道题目,我猜一下大家的内心独白。
- 这题肯定不选A了
- 不选A,答案又是哪个呢
- 给立在搞啥玩意儿,还选A吧
对于kotlin代码,若遇不快,首先反编译。看看java代码长什么样子。
厉害了,负 的确凭空消失了。
再回头对比一下两次的代码,如下图:
左边的代码在条件判断分支中执行打印语句,符合我们想象中的执行逻辑,这没有问题。
讨论为啥右边的代码打印结果为啥会这样?
总结:
右边的代码在 let 代码块中执行打印语句,虽然不符合我们想象中的执行逻辑,但是它仍然打印了 ,正,0 。说明这个 let 成功作用在了一个 String 对象上,间接说明了 Kotlin 的 if/else 是有返回值的。
盯着let确实很难理解,可以理解kotlin对于else if的支持,就是转化为
if(){}
else
{
if(){}else{}
}
这么看就容易理解了。
以后多加小心kotlin的else if.