2011-06-04 58 views
3

在我的Scala代码的for循环中,我想跳到循环的开始处,并且在特定条件为真时不执行以下语句。在Java中,我可以使用'继续'来做到这一点。但是“继续”在Scala中似乎不起作用。 那么我怎样才能跳到我的循环在斯卡拉计划的开始?请致电 谢谢。在Scala程序中跳到for循环的开始

+0

你能解释一下你的用例吗?几乎可以保证,有一个更好的解决方案,根本不涉及循环。 – 2011-06-04 17:04:43

+0

我敢打赌,OP可以通过在'for'理解中使用'if'guard来实现。 – lcn 2013-12-06 06:06:00

回答

5

如果您使用的Scala 2.7,从http://www.scala-lang.org/node/257

这些关键字不包括在斯卡拉2.7,并且必须以不同的方式来实现。对于中断,最简单的做法是将代码分成更小的方法,并使用返回提前退出。为了继续,一个简单的方法是将循环的跳过部分放入if中。斯卡拉2.8将包括休息,但不会继续。

如果您使用的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想你是。

7

首先,您的最佳选择通常是避免这种构造,并尝试使用更高级别的方法(例如,您通常可以做xs.map(doSomeStuff).filter(condition).foreach(doConditionalStuff))。这并不总是实际可行,但它比你最初想象的要多得多。尽管如此,问题仍然存在于继续有用的情况下:长码块中的很长一系列守卫不能被逻辑分解成碎片。

continue对于具有匿名功能的语言来说是一种困难的语言结构。其中一个原因是实际的:匿名函数是一个函数,你不能轻易地回到某个仅仅通过执行跳转来调用它的循环。另一个原因是概念上的:如果你在map方法中,它本身就是一种循环,那么continue究竟应该把你带回到开始?

,而不是与这些尴尬的情况下,斯卡拉提供了处理(如库函数,基于例外)一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类,甚至可以分成多个级别。这里是既打破模拟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拥有非常有用的功能,因此无意义的休息和继续是如何发生的,这不是一个糟糕的妥协。