在Kotlin,我可以创建一个倒退的范围吗?

jjn*_*guy 37 range kotlin

我查看了Ranges的文档,但我没有看到向后范围.

有可能做这样的事情:

for (n in 100..1) {
    println(n)
}
Run Code Online (Sandbox Code Playgroud)

得到结果:

100
99
98
...
Run Code Online (Sandbox Code Playgroud)

Had*_*iri 64

使用downTo,如:

for (n in 100 downTo 1) {
//
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么它不是"for(n in 100..1)"?难道不是一个协议,如果第一个数字更大,那么范围倒数? (20认同)
  • @x2bool,虽然它很有用,但在某些情况下它没有用。例如,您想要从“0”循环到“count - 1”,但不想检查限制(就像在 Java 中一样)。如果“count”变为 0,则“0”将降至 -1,这将破坏算法。 (3认同)
  • 有没有排除下限的东西?例如,如果我想要从 100 到 2。并且想要排除 1。 (2认同)

Fra*_*olo 8

使用减-一元运算符支持反转范围,如-(1..100).

要调用该范围的方法,您需要用括号括起它,如下所示(-(1..100)).foreach { println(it) }.

  • 是否有可能使rangeTo()函数更智能并自动处理?对我来说负范围意味着从-1到-100的计数. (5认同)

Esc*_*ity 7

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

for (n in 100 downTo 1) {
    println(n)
}
Run Code Online (Sandbox Code Playgroud)

但是为什么Kotlin团队选择了100 downTo 1vs 100..1

我认为100..1当我们尝试使用变量而不是文字时,语法会很糟糕。如果我们输入

for (n in b..a)

那么不清楚我们要使用哪个循环。

我们可能打算倒数,但是如果b结果小于a,那么我们的程序实际上将倒数!那将是错误的来源。


Coo*_*ind 5

(100 downto 1).map{ println(it) }
Run Code Online (Sandbox Code Playgroud)


let*_*ner 5

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

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

用法:

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

// 100 downTo 0
for (i in 100 toward 0) {
    // Do things
}
Run Code Online (Sandbox Code Playgroud)

  • 因此,没有与之等效的原生Kotlin吗? (2认同)
  • 我还没找到。您可以获得相同的结果,例如使用 [step](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/step.html) 函数进行某些 Progression,但仍然需要计算步长靠你自己。我想,Kotlin 架构师想要创建一种完全可读的语言。这意味着代码执行必须与编写的完全相同,而像我的“toward”这样的通用中缀函数并不完全符合这个想法。 (2认同)