範囲のドキュメント を見ましたが、後方範囲についての言及はありません。
次のようなことは可能ですか?
for (n in 100..1) {
println(n)
}
そして結果を得る:
100
99
98
...
次のようにdownToを使用します。
for (n in 100 downTo 1) {
//
}
逆の範囲は、-(1..100)
のようにマイナス-
単項演算子を使用してサポートされます。
その範囲でメソッドを呼び出すには、(-(1..100)).foreach { println(it) }
のようにメソッドを括弧で囲む必要があります。
他の人が指摘しているように、正解は
_for (n in 100 downTo 1) {
println(n)
}
_
しかし、Kotlinチームが_100 downTo 1
_と_100..1
_を選択したのはなぜですか?
リテラルの代わりに変数を使おうとすると、構文_100..1
_は悪いと思います。入力した場合
for (n in b..a)
そうすると、どのループを使用したいかが明確になりません。
逆方向に数えるつもりだったかもしれませんが、b
がa
よりも小さいことが判明した場合、プログラムは実際には上向きに数えます。それがバグの原因になります。
「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
}
リンクした正確なページを見ると、for (n in (1..100).reversed())
を実行できるreversed
関数の提案がありますが、まだ実装されていないようです。 ..
演算子は常にカウントアップします。
(100 downto 1).map{ println(it) }