问题描述
Kotlin有很好的迭代函数,比如 forEach
或者 repeat
,但是我不能使 break
和 continue
操作符与它们一起工作(包括本地和非本地): repeat(5){
break
}
(1..5).forEach {
continue @ forEach
}
目标是模仿通常的循环,尽可能靠近。这在Kotlin的一些老版本中是绝对有可能的,但我很难重现这个语法。
这个问题可能是标签(M12)的错误,但我认为第一个例子应该可以工作。
在我看来,我已经读了一些关于特殊技巧/注释的地方,但我找不到任何关于这个主题的参考。可能看起来像下面这样:
public inline fun repeat(times:Int,@loop body:(Int) - > Unit ){
for(index in 0..times -1){
body(index)
}
}
问题这个功能是3岁,所以我想这是不会被固定的。
原始回答:
由于您提供了(Int) - >单元
,你不能打破它,因为编译器不知道它在循环中使用。
:
使用常规循环:
// your code here
}
如果循环是方法的最后一个代码
,可以使用return
来退出方法(或返回值
,如果它不是unit
方法)。
使用方法
创建一个返回Boolean
继续的自定义重复方法方法。
public inline fun repeatUntil(times:Int,body:(Int) - > Boolean){
for如果(!body(index))break
}
}
Kotlin has very nice iterating functions, like
forEach
orrepeat
, but I am not able to make thebreak
andcontinue
operators work with them (both local and non-local):repeat(5) { break } (1..5).forEach { continue@forEach }
The goal is to mimic usual loops with the functional syntax as close as it might be. It was definitely possible in some older versions of Kotlin, but I struggle to reproduce the syntax.
The problem might be a bug with labels (M12), but I think that the first example should work anyway.
It seems to me that I've read somewhere about a special trick/annotation, but I could not find any reference on the subject. Might look like the following:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) { for (index in 0..times - 1) { body(index) } }
解决方案Edit:
According to Kotlin's old documents, it should be possible using annotations. However, it is not implemented yet.The issue for this functionality is 3 years old, so I guess it is not going to be fixed.
Original Answer:
Since you supply a(Int) -> Unit
, you can't break from it, since the compiler do not know that it is used in a loop.You have few options:
Use a regular for loop:
for (index in 0..times - 1) { // your code here }
If the loop is the last code in the method
you can usereturn
to get out of the method (orreturn value
if it is notunit
method).Use a method
Create a custom repeat method method that returnsBoolean
for continuing.public inline fun repeatUntil(times: Int, body: (Int) -> Boolean) { for (index in 0..times - 1) { if (!body(index)) break } }
这篇关于在Kotlin的`forEach`中`break`和`continue`的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!