具有多个生成器的for循环如何在Scala中工作?

时间:2018-09-30 05:05:54

标签: scala for-loop nested-loops

我是Scala的新手,我来自当务之急,但我想从功能上理解它。我对以下代码段的行为感到非常困惑。

val res = for {
  i <- 1 to 2
  j <- 1 to 2
} yield (i, j)

println(s"res is $res")

此代码将按预期打印 res是Vector((1,1),(1,2),(2,1),(2,2))。但是,将上述内容略微修改为

val res = for {
  i <- 1 to 2
  j <- i to 0
} yield (i, j)

println(s"res is $res")

打印 res是Vector()

为什么第二个循环版本不产生Vector((1,1),(1,0),(2,2),(2,1),(2,0))?

此行为对我使用Scala中的索引遍历2D矩阵的能力产生了重大影响。通常,如何在跟踪行索引和列索引的同时,以惯用方式仅在矩阵的上三角部分上循环?

1 个答案:

答案 0 :(得分:5)

让REPL告诉你。

scala> 1 to 2
res0: scala.collection.immutable.Range.Inclusive = Range 1 to 2

scala> 1 to 0
res1: scala.collection.immutable.Range.Inclusive = empty Range 1 to 0
                                                   ^^^^^

除非您告诉Range,否则val res = for { i <- 1 to 2 j <- i to 0 by -1 } yield (i, j) //res: IndexedSeq[(Int, Int)] = Vector((1,1), (1,0), (2,2), (2,1), (2,0)) 不会下降。

regex.split(param)