Kotlin Return 到标签

先看例子:

(1..5).forEach {
if (it == 3) {
return@forEach
}
println(it)
}
println("test over")

这段代码执行结果是什么?

错误:

1
2
test over

这里可千万不要想当然,认为循环会结束。正确的结果是

1
2
4
5
test over

关于 Kotlin 中 return 使用的官方文档:

https://www.kotlincn.net/docs/reference/returns.html

先说结论:

  1. return 默认从最直接包围它的函数或者匿名函数返回。
  2. return 后面跟标签,返回到标签。

关于第一点,如下代码:

fun test() {
(1..5).forEach {
if (it == 3) {
return
}
println(it)
}
println("test over")
}

此时 return 会直接从 test() 函数中返回,输出:

1
2

对于第二点,返回到标签,首先名明白什么是标签。在 Kotlin 中任何表达式都可以用标签来标记,标签的格式为标识符后面跟@ 符号,例如 abc@aaa@ 等都是有效标识符。

再看开头的例子,为什么没有跳出循环?

其实例子中 @forEach 是一个和隐式标签,该例子等价于:

(1..5).forEach xxx@{
if (it == 3) {
return@xxx // 返回到 lambda 表达式的调用者
}
println(it)
}
println("test over")

forEach 后面跟的式一个lambda 表达式,此时的 return 实际上是返回到该 lambda 表达式的调用者,而并跳出 forEach 循环。

等价于下面使用匿名函数的实现方式,代码如下:

(1..5).forEach(fun(value: Int) {
if (value == 3) return // 返回到匿名函数的调用者
println(value)
})
println("test over")

那如果想要在循环到 3 的时候跳出循环,而不跳出函数,该如何办呢?

我们需要再调用 forEach 循环的调用处添加一个标签,再返回到该标签即可。如下:

run www@{
(1..5).forEach {
if (it == 3) {
return@www
}
println(it)
}
println("test over")
}

知识点虽小,但是本人真真切切地踩过坑。记录下来,也希望其他人忽视了这个知识点的人,看到以后不要踩坑了。。。

Kotlin return@xxx 的坑的更多相关文章

  1. javascript中onSubmit="return xxx()"的问题

    javascript中onSubmit="return xxx()"刚开始我是想不通为什么要加return在里面呢,后来想想onSubmit="flase"就不 ...

  2. Kotlin从入门到掉坑里

    为什么要用Kotlin,和Java完全兼容,相互之间引用完全不是问题,所有没有什么负担. 使用Kotlin已经近一个月,基本上看完了语法就上正式项目了,期间几次准备放弃,最终坚持下来了.关于Kotli ...

  3. auto semicolon insertion 自动分号补齐的坑

    今天发现js自动分号补齐的坑,来看如下两段代码: function Hello(){ return { name: ’JavaScript’ }; } alert(Hello()); //输出unde ...

  4. 【转】golang-defer坑的本质

    本文节选自https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.4.html 作者的分析非常透彻,从问题本质分析,就不会对defer产生 ...

  5. 如何利用aop的环绕消息处理log, 以及各种坑的记录

    如何利用aop的环绕消息处理log, 以及各种坑的记录 本文链接: https://www.cnblogs.com/zizaiwuyou/p/11667423.html 因为项目里有很多地方要打log ...

  6. PHP友盟推送消息踩坑及处理

    公司的客户端的推送选用友盟推送,但是友盟的官方文档描述很少,对新手很不友好,所以特写此采坑纪录,废话不多说上代码. 公司业务只涉及单播和广播.所以只提供了单播和广播,业务拓展的话会补充其余部分. 消息 ...

  7. UWP中重用C/C++代码时踩过的一些坑

    标题中提到的UWP,主要是指用C#来写UWP的主工程,开发过程中可能需要调用C/C++实现的库. 为什么需要调用C/C++的库呢,举个例子,开源库OpenSSL实现了许多加密算法,稳定快速,我们想在应 ...

  8. ajax里面success函数return上层接收不到

    开发一个小功能,在success fail里直接return,没有收到返回值.排查,查了下往上的博客,参考了以下三个: http://blog.csdn.net/fairyhawk/article/d ...

  9. js中的return,return true,return false小结

    return  函数执行到这句时会终结,并返回调用函数,而且把表达式的值作为函数的结果返回 return false 可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转 ...

  10. UiAutomator2.0升级填坑记

    UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...

随机推荐

  1. [转帖]xsos:一个在 Linux 上阅读 SOSReport 的工具

    https://www.sohu.com/a/315931829_100034897 xsos 是一个帮助用户轻松读取 Linux 系统上的 sosreport 的工具.另一方面,我们可以说它是 so ...

  2. [转帖]nmon使用及监控数据分析

    [使用] [监控数据分析] 参考链接:nmon监控数据分析 性能测试中,各个服务器资源占用统计分析是一个很重要的组成部分,通常我们使用nmon这个工具来进行监控以及监控结果输出. 一.在监控阶段使用类 ...

  3. [译]深入了解现代web浏览器(四)

    本文是根据Mariko Kosaka在谷歌开发者网站上的系列文章https://developer.chrome.com/blog/inside-browser-part4/翻译而来,共有四篇,该篇是 ...

  4. 【构造,树】【Loj】Loj6669 Nauuo and Binary Tree

    2023.7.3 Problem Link 交互库有一棵 \(n\) 个点的二叉树,你每次可以询问两个点之间的距离,猜出这棵二叉树.\(n\le 3000\),询问次数上限 \(30000\). 首先 ...

  5. git有关commit的命令

    2.更改最近一次(本次) commit 的提交信息: 当我们执行 git add . git commit -m "0-0-1" 之后我们发现自己写的提交信息是不符合项目要求的,这 ...

  6. 【VictoriaMetrics】一个小优化:循环改查表,性能提升56.48 倍

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 做了一个 vm-storage 数据文件 merge 的工 ...

  7. 源码阅读:VictoriaMetrics中的golang代码优化方法

    全文请移步:https://zhuanlan.zhihu.com/p/469239020 或关注我的公众号: 公众号:一本正经的瞎扯

  8. ABP vNext系列文章10---分布式事务集成netcore.Cap

    最近项目中要用到分布式事务功能,调研了DTM和Cap,最终确定用Cap来实现,Cap支持最终一致性,项目中采用MQ作为消息中间件,数据库用的mysql,集成步骤如下: 1.在需要发布消息的服务中引入如 ...

  9. 10.2 调试事件获取DLL装载

    理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一 ...

  10. 物色到的 c# 模拟 http post get 请求 做下笔记

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...