我看了看the documentation for the Ranges,没有看到提到向后的范围。是否可以执行以下操作:
for (n in 100..1) { println(n) }
并得到结果:
100 99 98 ...
hgtggwj01#
downTo的用法如下:
downTo
for (n in 100 downTo 1) { // }
7gcisfzg2#
正如其他人指出的,正确答案是
for (n in 100 downTo 1) { println(n) }
但是为什么Kotlin团队选择100 downTo 1 vs 100..1呢?我认为当我们尝试使用变量而不是文字时,语法100..1是不好的。for (n in b..a)那么就不清楚我们要使用什么循环。我们可能打算向后计数,但如果b比a小,那么我们的程序实际上会向上计数!这将是bug的来源。
100 downTo 1
100..1
for (n in b..a)
b
a
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 }
yrwegjxp4#
使用减号-一元运算子支援反向范围,如-(1..100)。若要在该范围上调用方法,则需要用括号将其括起来,如下所示
-
-(1..100)
(-(1..100)).foreach { println(it) }
des4xlb05#
(100 downto 1).map{ println(it) }
5条答案
按热度按时间hgtggwj01#
downTo
的用法如下:7gcisfzg2#
正如其他人指出的,正确答案是
但是为什么Kotlin团队选择
100 downTo 1
vs100..1
呢?我认为当我们尝试使用变量而不是文字时,语法
100..1
是不好的。for (n in b..a)
那么就不清楚我们要使用什么循环。
我们可能打算向后计数,但如果
b
比a
小,那么我们的程序实际上会向上计数!这将是bug的来源。pu3pd22g3#
作为“for”的通用范围函数的示例:
用法:
yrwegjxp4#
使用减号
-
一元运算子支援反向范围,如-(1..100)
。若要在该范围上调用方法,则需要用括号将其括起来,如下所示
des4xlb05#