Skip to content
This repository has been archived by the owner on Apr 13, 2023. It is now read-only.

Latest commit

 

History

History
115 lines (93 loc) · 3.52 KB

Ranges Reloaded.md

File metadata and controls

115 lines (93 loc) · 3.52 KB
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()函数的结果始终是进度