
fun main(args: Array<String>) { val list = 1..5; println("1:-------------") list.forEach(fun(a: Int) { if (a == 3) return; println(a); }); println("2:-------------") list.forEach { if (it == 3) return; println(it) } } 感兴趣的 V 友可以先自己推断一下输出结果各自是什么..
我说不清楚为什么,有懂的老哥还请赐教。谢谢~!
&bsp; 1 ysc3839 Nov 2, 2020 目测前面那个输出了 1 2 4 5,后面那个输出了 1 2 。大概是因为前者是从 fun return 了,而后者是从 main return 了。 |
2 hoichallenger Nov 3, 2020 上面是匿名函数,下面是 Lambda 表达式,return 的含义当然不一样。只要在下面的 forEach 里使用 Qualified returns ( return@forEach )就可能保证两者结果一致了。 |
3 Jirajine Nov 3, 2020 via Android @hoichallenger 这种行为很奇怪,lambda 也是函数,return 应该从最内层函数返回。 不过这种 labeled return 倒是很有用,可惜其他语言没有类似的机制。 |
6 Newyorkcity OP @hoichallenger return 的含义的不一祥具体是指? |
7 staerlloll Nov 3, 2020 第一个是在 fun(a: Int) { } 里 return, 所以在 prinln 之前结束了该 fun,但这并不影响 list.forEach 继续 第二个是在 list.forEach 里 return, 所以到 3 了就停了 |
8 Newyorkcity OP @starerlloll 第二个为什么会影响到外面的 forEach 呢?我个人了解这种写法是一个语法糖,当被调用的函数甲所需要的入参为一个函数类型时,可以直接将被调用的函数甲不接(),而接{}并在其中完成入参函数的函数体。。。但语法糖背后的逻辑不应该仍然是函数甲(先具体到 forEach )把每个元素都调用一次函数乙吗? 莫非此时传入函数乙的变成了 list ? |
9 zhtf Nov 3, 2020 |
10 hoichallenger Nov 3, 2020 @Newyorkcity Kotlin 的文档里关于 return 是这么说的:By default returns from the nearest enclosing function or anonymous function. 因为 Lambda 是表达式( Expression )不是函数( Function ),所以第二个 forEach 里的 return 最近的函数是 main 函数,而第一个 forEach 里的 return 最近的函数是那个匿名函数。 |