在我的Scala代码的for循环中,我想跳到循环的开始处,并且在特定条件为真时不执行以下语句。在Java中,我可以使用'继续'来做到这一点。但是“继续”在Scala中似乎不起作用。 那么我怎样才能跳到我的循环在斯卡拉计划的开始?请致电 谢谢。在Scala程序中跳到for循环的开始
3
A
回答
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
注意,通常需要break
和continue
意味着你不是那样功能强大的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拥有非常有用的功能,因此无意义的休息和继续是如何发生的,这不是一个糟糕的妥协。
相关问题
- 1. for循环中的Scala println
- 2. 跳出for循环
- 3. 无法跳出For循环到另一个For循环
- 4. 跳过的for循环
- 5. 循环到开始
- 6. 从零开始编写for循环程序集
- 7. Python for循环跳过其他循环?
- 8. For循环scala没有序列?
- 9. for循环内的for循环(Scala)的产出
- 10. 'For'循环被跳过?
- 11. For循环跳过值
- 12. For循环跳过作业
- 13. VBA:跳出for循环
- 14. Java - 跳过for循环中的值
- 15. 跳过for循环中的IndexError
- 16. 跳出python中的for循环
- 17. Javascript - 对象,for循环从2开始
- 18. for循环,使开始值空白?
- 19. For循环在Javascript中的for循环
- 20. while循环开始后程序停止
- 21. Java,循环不从程序的开始处开始
- 22. scanf函数在C编程中跳过for循环的输入
- 23. 如何将用户循环回到具有两个循环的程序开始
- 24. Python在打印后跳过for循环()
- 25. For循环跳过数字在C
- 26. (C++)for循环正在被跳过
- 27. Bash嵌套for循环始终在第一行开始
- 28. 在for循环和条件语句中添加到scala映射
- 29. 如何循环回到程序的开始 - Python
- 30. For循环到While循环
你能解释一下你的用例吗?几乎可以保证,有一个更好的解决方案,根本不涉及循环。 – 2011-06-04 17:04:43
我敢打赌,OP可以通过在'for'理解中使用'if'guard来实现。 – lcn 2013-12-06 06:06:00