我是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矩阵的能力产生了重大影响。通常,如何在跟踪行索引和列索引的同时,以惯用方式仅在矩阵的上三角部分上循环?
答案 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)