跳到Scala程序中for循环的开头

时间:2011-06-04 16:35:14

标签: java scala

在我的Scala代码的for循环中,我想跳到循环的开头,如果特定条件为真,则不执行以下语句。在Java中,我可以使用'continue'来执行此操作。但是'继续'似乎在Scala中不起作用。 那么我如何在Scala程序中跳到循环的开头呢?

请帮助 谢谢。

2 个答案:

答案 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

请注意,通常需要breakcontinue意味着您没有Scala希望的功能。