Kotlin return@xxx 的坑
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
先说结论:
- return 默认从最直接包围它的函数或者匿名函数返回。
- 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 的坑的更多相关文章
- javascript中onSubmit="return xxx()"的问题
javascript中onSubmit="return xxx()"刚开始我是想不通为什么要加return在里面呢,后来想想onSubmit="flase"就不 ...
- Kotlin从入门到掉坑里
为什么要用Kotlin,和Java完全兼容,相互之间引用完全不是问题,所有没有什么负担. 使用Kotlin已经近一个月,基本上看完了语法就上正式项目了,期间几次准备放弃,最终坚持下来了.关于Kotli ...
- auto semicolon insertion 自动分号补齐的坑
今天发现js自动分号补齐的坑,来看如下两段代码: function Hello(){ return { name: ’JavaScript’ }; } alert(Hello()); //输出unde ...
- 【转】golang-defer坑的本质
本文节选自https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.4.html 作者的分析非常透彻,从问题本质分析,就不会对defer产生 ...
- 如何利用aop的环绕消息处理log, 以及各种坑的记录
如何利用aop的环绕消息处理log, 以及各种坑的记录 本文链接: https://www.cnblogs.com/zizaiwuyou/p/11667423.html 因为项目里有很多地方要打log ...
- PHP友盟推送消息踩坑及处理
公司的客户端的推送选用友盟推送,但是友盟的官方文档描述很少,对新手很不友好,所以特写此采坑纪录,废话不多说上代码. 公司业务只涉及单播和广播.所以只提供了单播和广播,业务拓展的话会补充其余部分. 消息 ...
- UWP中重用C/C++代码时踩过的一些坑
标题中提到的UWP,主要是指用C#来写UWP的主工程,开发过程中可能需要调用C/C++实现的库. 为什么需要调用C/C++的库呢,举个例子,开源库OpenSSL实现了许多加密算法,稳定快速,我们想在应 ...
- ajax里面success函数return上层接收不到
开发一个小功能,在success fail里直接return,没有收到返回值.排查,查了下往上的博客,参考了以下三个: http://blog.csdn.net/fairyhawk/article/d ...
- js中的return,return true,return false小结
return 函数执行到这句时会终结,并返回调用函数,而且把表达式的值作为函数的结果返回 return false 可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转 ...
- UiAutomator2.0升级填坑记
UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...
随机推荐
- [转帖]深入理解Redis的scan命令
熟悉Redis的人都知道,它是单线程的.因此在使用一些时间复杂度为O(N)的命令时要非常谨慎.可能一不小心就会阻塞进程,导致Redis出现卡顿. 有时,我们需要针对符合条件的一部分命令进行操作,比如删 ...
- [转帖]Arm vs X86 (unfinished)
http://home.ustc.edu.cn/~shaojiemike/posts/arm/ ARM Ltd history 诞生 1981年,被Intel拒绝的Acorn(橡子) Comput ...
- css 动画 div顺时针方向移动,
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- mysql系列基础篇03----约束
一.概述 1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据 2.目的:保证数据库中数据的正确,有效性和完整性. 3.分类 二.约束演示 创建一个用户表 create table my ...
- 微信小程序-页面跳转Tabbar
官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#tabBar 首先我们 ...
- 抢占GPU的脚本
前言 同样的,这篇博客也源自于我在做组内2030项目所产生的结果.当时,5个硕士生需要进行类似的微调工作,偶尔还会有博士生使用服务器上的GPU,但服务器上仅有8块GPU. 因此,如何快速抢占到 \(n ...
- 【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例
相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...
- 多进程实现socket通信(Python)
服务器端: #__author__:Kelvin #date:2020/5/9 11:35 import socket from multiprocessing import Process def ...
- 揭秘C语言的心脏:深入探索指针与数组的奥秘
欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. strlen()和sizeof的区别 名称 区别 sizeof 1. sizeof是 ...
- 《Learning from Context or Names?An Empirical Study on Neural Relation Extraction》论文阅读笔记
代码 原文地址 预备知识: 1.什么是对比学习? 对比学习是一种机器学习范例,将未标记的数据点相互并列,以教导模型哪些点相似,哪些点不同. 也就是说,顾名思义,样本相互对比,属于同一分布的样本在嵌入空 ...