在Kotlin中,我可以创建一个向后计数的范围吗?

5sxhfpxr  于 2022-12-13  发布在  Kotlin
关注(0)|答案(5)|浏览(160)

我看了看the documentation for the Ranges,没有看到提到向后的范围。
是否可以执行以下操作:

for (n in 100..1) {
    println(n)
}

并得到结果:

100
99
98
...
hgtggwj0

hgtggwj01#

downTo的用法如下:

for (n in 100 downTo 1) {
//
}
7gcisfzg

7gcisfzg2#

正如其他人指出的,正确答案是

for (n in 100 downTo 1) {
    println(n)
}

但是为什么Kotlin团队选择100 downTo 1 vs 100..1呢?
我认为当我们尝试使用变量而不是文字时,语法100..1是不好的。
for (n in b..a)
那么就不清楚我们要使用什么循环。
我们可能打算向后计数,但如果ba小,那么我们的程序实际上会向上计数!这将是bug的来源。

pu3pd22g

pu3pd22g3#

作为“for”的通用范围函数的示例:

private infix fun Int.toward(to: Int): IntProgression {
    val step = if (this > to) -1 else 1
    return IntProgression.fromClosedRange(this, to, step)
}

用法:

// 0 to 100
for (i in 0 toward 100) {
    // Do things
}

// 100 downTo 0
for (i in 100 toward 0) {
    // Do things
}
yrwegjxp

yrwegjxp4#

使用减号-一元运算子支援反向范围,如-(1..100)
若要在该范围上调用方法,则需要用括号将其括起来,如下所示

(-(1..100)).foreach { println(it) }
des4xlb0

des4xlb05#

(100 downto 1).map{ println(it) }

相关问题