我认为先前的答案确实可以解决在上下文相对不受限制的情况下为Scala break
或continue
以语言范围定义语义的问题。
我写了一个小库,它定义break
和continue
在更受限的上下文:经由Scala的迭代过序列-推导。通过关注该上下文,我相信语义变得明确并且易于推理。
该库位于此处:https : //github.com/erikerlandson/breakable
这是一个简单的代码示例:
scala> import com.manyangled.breakable._
import com.manyangled.breakable._
scala> val bkb2 = for {
| (x, xLab) <- Stream.from(0).breakable // create breakable sequence with a method
| (y, yLab) <- breakable(Stream.from(0)) // create with a function
| if (x % 2 == 1) continue(xLab) // continue to next in outer "x" loop
| if (y % 2 == 0) continue(yLab) // continue to next in inner "y" loop
| if (x > 10) break(xLab) // break the outer "x" loop
| if (y > x) break(yLab) // break the inner "y" loop
| } yield (x, y)
bkb2: com.manyangled.breakable.Breakable[(Int, Int)] = com.manyangled.breakable.Breakable@34dc53d2
scala> bkb2.toVector
res0: Vector[(Int, Int)] = Vector((2,1), (4,1), (4,3), (6,1), (6,3), (6,5), (8,1), (8,3), (8,5), (8,7), (10,1), (10,3), (10,5), (10,7), (10,9))
break
并且continue
需要一些其他的清理机制。OTOHreturn
是一种有序终止功能的方法,并且任何清理机制已经存在。