以前の答えは、セマンティクスを定義する問題に正義があると思います break
continue
、比較的制約のないコンテキストを使用して、Scalaのまたは言語全体。
私は定義する小さなライブラリを書きました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
は機能を正常に終了する方法であり、いずれにせよクリーンアップ機構はすでに存在しています。