在我的Scala代码的for循环中,我想跳到循环的开头,如果特定条件为真,则不执行以下语句。在Java中,我可以使用'continue'来执行此操作。但是'继续'似乎在Scala中不起作用。 那么我如何在Scala程序中跳到循环的开头呢?
请帮助 谢谢。
答案 0 :(得分:7)
首先,您最好的选择通常是避免使用这种构造,并尝试使用更高级别的方法(例如,您经常可以xs.map(doSomeStuff).filter(condition).foreach(doConditionalStuff)
)。这并不总是实用的,但它比你最初怀疑的要频繁得多。尽管如此,问题仍然存在于那些继续有用的情况:长代码块中的一长串警卫不能在逻辑上分成碎片。
continue
是一种困难的语言结构。一个原因是实用的:匿名函数是一个函数,你不能轻易地回到一个只是通过执行跳转来调用它的循环。另一个原因是概念性的:如果你使用map
方法,它本身就是一种循环,那么continue
究竟应该把你带回到开头?
Scala不是处理这些尴尬的案例,而是提供(作为库函数,基于异常)一个breakable
构造,明确指定要中断的位置:
import scala.util.control.Breaks._
breakable {
for (i <- 1 to 10) {
if (i>3) break
println(i)
}
}
但是因为这是一个通用的构造,你也可以在for循环中使用它:
import scala.util.control.Breaks._
for (i <- 1 to 10) {
breakable {
if ((i%2)==0) break
println(i)
}
}
如果您创建自己的中断类,甚至可以分为多个级别。以下是使用break和continue模拟for循环的示例:
val outer,inner = new scala.util.control.Breaks
outer.breakable {
for (i <- 1 to 10) {
inner.breakable {
if ((i%2)==0) inner.break
if (i>3) outer.break
println(i)
}
}
}
如果您经常使用此模式,则可以更改导入以使其更好:
// Do this once at the top of the file
import scala.util.control.Breaks._
object Continued extends scala.util.control.Breaks {}
import Continued.{break=>continue, breakable=>continuing}
// Now every time you need it:
breakable{ for (i <- 1 to 10) continuing {
if ((i%2)==0) continue
if (i>3) break
println(i)
}}
如果确实需要该功能,那么输入会更多一些工作,但考虑到无意义的中断和继续是在其他非常有用的功能的上下文中Scala有,这不是一个妥协的妥协。
答案 1 :(得分:5)
如果您使用的是Scala 2.7,请http://www.scala-lang.org/node/257
这些关键字不包含在Scala 2.7中,必须以不同的方式实现。对于休息,最简单的方法是将代码划分为更小的方法,并使用return提前退出。对于继续,一个简单的方法是将循环的跳过部分放入if。 Scala 2.8将包含break,但不会继续。
如果您使用的是Scala 2.8
import util.control.Breaks._
// for continue, write this somewhere in your program
val continue = new Breaks
/* use like */
Breaks.breakable {
for (i <- 1 to 10)
continue.breakable { if (i % 2 == 0) continue.break; println(i); if (i == 7) Breaks.break }
}
//source http://daily-scala.blogspot.com/2010/04/breaks.html
请注意,通常需要break
和continue
意味着您没有Scala希望的功能。