title | date | author | tags | keywords | categories | reward | reward_title | reward_wechat | reward_alipay | source_url |
---|---|---|---|---|---|---|---|---|---|---|
[译]Ranges Reloaded |
2013-02-06 06:47:00 -0800 |
Evgeny Gerashchenko |
官方动态 |
false |
Have a nice Kotlin! |
在 Kotlin M5 我们已经重新设计了我们的范围。 </ span>
范围表达式与具有 rangeTo </ tt>函数形成 操作员形式 补充 in和!in 。范围是针对任何可比类型( Comparable </ code>的子类)定义的,但是对于数字原语,它被优化。以下是使用范围的示例:
{% 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()</ tt>函数:
{% raw %}
{% endraw %}
for (i in 4 downTo 1) print(i) // prints "4321"
{% raw %}
{% endraw %}
可以用任意步长迭代数字,不等于1?当然, step()</ tt>功能会帮助你:
{% 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; </ tt>和进展&lt; N&gt; </ tt>。
范围&lt; T&gt; </ tt>表示数学意义上的间隔,用于可比类型。它有两个端点: start </ tt>和 end </ tt>,它们包含在范围内。主要操作是 contains()</ tt>,通常在</ tt> / !中的</ tt>操作符中以的形式使用。
进展&lt; N&gt; </ tt>表示 算术进展 ,定义为数字类型。它具有 start </ tt>, end </ tt>和非零增量</ tt>。 进展&lt; N&gt; </ tt>是 Iterable&lt; N&gt; </ tt>的子类型,因此它可以用于for循环和诸如 map </ tt>, filter </ tt>等等。第一个元素是 start </ tt>,每个下一个元素等于上一个加号增量</ tt>。在进化中的迭代</ tt>相当于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 %}
对于数字,“ .. </ tt>”运算符创建一个对象,它们都是 Range </ tt>和 Progression </ tt>。 downTo()</ tt>和 step()</ tt>函数的结果始终是进度</ tt>。