gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:35:57 27 4
gpt4 key购买 nike

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

请帮忙谢谢。

最佳答案

首先,您最好的选择通常是无论如何都要避免这种构造,并尝试使用更高级别的方法(例如,您通常可以执行 xs.map(doSomeStuff).filter(condition).foreach( doConditionalStuff)).这并不总是实用的,但它比您最初怀疑的要频繁得多。尽管如此,对于那些 continue 有用的情况仍然存在问题:长代码块中的一系列非常长的守卫无法在逻辑上分成几部分。

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 有,这不是一个糟糕的妥协。

关于java - 跳到 Scala 程序中 for 循环的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6237978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com