title | date | author | tags | keywords | categories | reward | reward_title | reward_wechat | reward_alipay | source_url | translator | translator_url |
---|---|---|---|---|---|---|---|---|---|---|---|---|
[译]Ranges Reloaded |
2013-02-06 06:47:00 -0800 |
Evgeny Gerashchenko |
官方动态 |
false |
Have a nice Kotlin! |
在 Kotlin M5 我们已经重新设计了我们的范围。
范围表达式与具有 rangeTo 函数形成 操作员形式 补充 in 和!in 。范围是针对任何可比类型(Comparable
的子类)定义的,但是对于数字原语,它被优化。以下是使用范围的示例:
{% raw %}
{% endraw %}if (i in 1..10) { // equivalent of 1 <= i && i <= 10
println(i)
}
if (x !in 1.0..3.0) println(x)
if (str in "island".."isle") println(str)
// equivalent of "island" <= str && str <= "isle"
{% raw %}
{% endraw %}数值范围有额外的功能:可以迭代。编译器在 Java 的索引 for 循环的简单模拟中关心转换,而不需要额外的开销。例子:
{% raw %}
{% endraw %}for (i in 1..4) print(i) // prints "1234"
for (i in 4..1) print(i) // prints nothing
for (x in 1.0..2.0) print("$x ") // prints "1.0 2.0 "
{% raw %}
{% endraw %}如果你想以相反的顺序迭代数字怎么办?这很简单。您可以使用标准库中定义的 downTo()函数:
{% raw %}
{% endraw %}for (i in 4 downTo 1) print(i) // prints "4321"
{% raw %}
{% endraw %}可以用任意步长迭代数字,不等于 1?当然, step()功能会帮助你:
{% raw %}
{% endraw %}for (i in 1..4 step 2) print(i) // prints "13"
for (i in 4 downTo 1 step 2) print(i) // prints "42"
for (i in 1.0..2.0 step 0.3) print("$x ") // prints "1.0 1.3 1.6 1.9 "
{% raw %}
{% endraw %}库中有两个特征: Range&lt; T&gt; 和进展&lt; N&gt; 。 范围&lt; T&gt; 表示数学意义上的间隔,用于可比类型。它有两个端点: start 和 end ,它们包含在范围内。主要操作是 contains(),通常在 / !中的操作符中以的形式使用。 进展&lt; N&gt; 表示 算术进展 ,定义为数字类型。它具有 start , end 和非零增量。 进展&lt; N&gt; 是 Iterable&lt; N&gt; 的子类型,因此它可以用于 for 循环和诸如 map , filter 等等。第一个元素是 start ,每个下一个元素等于上一个加号增量。在进化中的迭代相当于 Java / JavaScript 中的索引 for 循环:
{% raw %}
{% endraw %}// if increment > 0
for (int i = start; i <= end; i += increment) {
// ...
}
// if increment < 0
for (int i = start; i >= end; i += increment) {
// ...
}
{% raw %}
{% endraw %}对于数字,“ .. ”运算符创建一个对象,它们都是 Range 和 Progression 。 downTo()和 step()函数的结果始终是进度。