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