多重声明
有时候可以通过给对象插入多个成员函数做区别是很方便的,比如:
val
(name, age)
= person
这种语法叫多重声明。多重声明一次创建了多个变量。我们声明了俩个新变
量:
name age
并且可以独立使用:
println(name)
println(age)
多重声明被编译成下面的代码:
val
name
= persion.component1()
val
age
= persion.component2()
component1() component2()
是另一个转换原则的例子。任何类型都可以在多
重分配的右边。当然了,也可以有
component3() component4()
等等
多重声明也可以在
for
循环中用
for
((a, b)
in
collection) { ... }
参数
a
和
b
是
component1() component2() 的返回值
例子:一个函数返回俩个值
要是一个函数想返回俩个值。比如,一个对象结果,一个是排序的状态。在
Kotlin
中的一个紧凑的方案是声明
data
类并返回实例:
data
class
Result
(
val
result
:
Int
,
val
status
: Status)
fun
function
(...)
: Result {
//...
return
Result(result, status)
}
val
(result, status)
= function(...)
数据类自动声明
componentN()
函数
注意:也可以使用标准类
Pair
并让函数返回
'Pair'
,但可读性不是很强
例子:多重声明和
Map
转换
map
的最好办法可能是下面这样:
for
((key, value)
in
map) {
}
为了让这个可以工作,我们需要
通过提供
iterator()
函数序列化呈现
map
通过
component1()
和
component1()
函数是把元素成对呈现
事实上,标准库提供了这样的扩展:
fun
<K, V> Map<K, V>.
iterator
()
: Iterator<Map.Entry<K, V>> =
ent
rySet
()
.
iterator
()
fun
<K, V> Map.Entry<K, V>.
component1
()
=
getKey
()
fun
<K, V> Map.Entry<K, V>.
component2
()
=
getValue
()
因此你可以用
for
循环方便的读取
map (
或者其它数据集合)
Ranges
range
表达式是通过
rangeTo
函数形成的。
rangeTo
函数拥有形如
..
的操作符,该
操作符是用
in
和
!in
实现的。
Range
可以对任何可比较的类型做操作,但对整数
基本类型是优化过的。下面是些例子:
if
(i
in
1..10
) {
println(i)
}
if
(x !
in
1.0
.
.3.0
) println(x)
if
(str
in
"island"
..
"isle"
) println(str)
数字的范围有个附加的特性:它们可以迭代。编译器会把它转成类似于
java
的
for
循环的形式,且不用担心越界:
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 "
如果你想迭代数字并想反过来,这个相当简单,你可以使用
downTo()
函数
for
(i
in
4
downTo
1
) print(i)
也可以使用指定步数的迭代,这个用到
step()
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(
"$i "
)
// prints "1.0 1.3 1.6
1.9 "
工作原理
在标准库中有俩种接口:
Range
和
Progression
Range
表示数学范围上的一个间隔。它有俩个端点:
start
和
end
。主要的操作符
是
contains
通常在
in/!in
操作符内:
Progression
表示一个算数级数。它有一个
start
和
end
以及一个非零
increment
。
Progression
是
Iterable
的一个子类,因此可以使用在
for
循环中,或者
map filter
等等。第一个元素是
start
下一个元素都是前一个元素的
increment
。
Progression
的迭代与
java/javaScript
的
for
循环相同:
// if increment > 0
for
(int i = start; i <= end; i += increment) {
// ...
}
// if increment < 0
for (int i = start; i >= end; i += increment) {
// ...
}