前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让你迷惑的 Kotlin 代码(1)

让你迷惑的 Kotlin 代码(1)

作者头像
路遥TM
发布2021-08-31 15:42:40
3490
发布2021-08-31 15:42:40
举报
文章被收录于专栏:路遥的专栏

今天在 Medium 看到了一个很有趣的小知识,爬上来和大家分享一下。题目是这样的:

代码语言:javascript
复制
fun printIt(num: Int) {
    if (num < 0) {
        print("negative")
    } else if (num > 0) {
        print("positive")
    } else {
        print("zero")
    }
}

fun main() {
    printIt(-1)
    print(",")
    printIt(1)
    print(",")
    printIt(0)
}

大家可以猜一下答案。

代码语言:javascript
复制
A. negative,positive,zero
B. ,positive,zero
C. negative,,zero
D. negative,positive,

毫无疑问,大家的答案肯定是 A

那么?这道题的意义何在呢?

......

......

......

好吧,没错,答案就是 A 。可能没有写过代码的同学都能知道是 A 。容我把题目稍作改动。

代码语言:javascript
复制
fun printIt(num: Int) {
    if (num < 0) {
        "negative"
    } else if (num > 0) {
        "positive"
    } else {
        "zero"
    }.let { print(it) }
}

fun main() {
    printIt(-1)
    print(",")
    printIt(1)
    print(",")
    printIt(0)
}

仔细对比两道题目,模拟一下你的内心独白。

这题肯定不会选 A 了,除非博主是傻 X ! 不选 A,这题答案是什么呢? 博主是真傻 X,这题肯定还是选 A !

不妨打开 IDE 执行以下,控制台冷冷清清的输出了 ,positive,zero

negative 凭空消失了?

对于 Kotlin 代码,凡事不决,首先反编译。看看 Java 代码长什么样子。

代码语言:javascript
复制
   public static final void printIt(int num) {
      if (num >= 0) {
         String var1 = num > 0 ? "positive" : "zero";
         System.out.print(var1);
      }

   }

没错,negative 的确凭空消失了。

再回过头对比一下两次的代码,如下图。

左边的代码在条件判断分支中执行打印语句,符合我们想象中的执行逻辑,这没有问题。

右边的代码在 let 代码块中执行打印语句,虽然不符合我们想象中的执行逻辑,但是它仍然打印了 ,positive,zero 。说明这个 let 成功作用在了一个 String 对象上,间接说明了 Kotlin 的 if/else 是有返回值的。

那么,为什么第一个 if 的返回值被忽略了呢?因为作用域函数 let 。先来看另一段代码:

代码语言:javascript
复制
fun printIt(num: Int) {
    (if (num < 0) {
        "negative"
    } else if (num > 0) {
        "positive"
    } else {
        "zero"
    }).let { print(it) }
}

这段代码如你所想,工作正常。因为使用 () 显示指定了执行 let 函数的对象。

到这里,你应该也明白上面是怎么回事了。let 的执行上下文遵循了 就近原则 , 下图中的两段代码是等价的。

原文中还有几道有意思的题目,大家可以进去看看,地址:https://blog.kotlin-academy.com/puzzlers-on-kotlin-academy-week-1-84f42437ee94 。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 路遥TM 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档