Skip to content

Latest commit

 

History

History
113 lines (91 loc) · 3.52 KB

Ranges Reloaded.md

File metadata and controls

113 lines (91 loc) · 3.52 KB
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>。