多重声明
有时候可以通过给对象插入多个成员函数做区别是很方便的,比如:
1. val (name, age) = person
这种语法叫多重声明。多重声明一次创建了多个变量。我们声明了俩个新变量:name age 并且可以独立使用:
1. println(name)
2. println(age)
多重声明被编译成下面的代码:
1. val name = persion.component1()
2. val age = persion.component2()
component1() component2()是另一个转换原则的例子。任何类型都可以在多重分配的右边。当然了,也可以有 component3() component4() 等等
多重声明也可以在 for 循环中用
1. for ((a, b) in collection) { ... }
参数 a 和 b 是 component1() component2() 的返回值
例子:一个函数返回俩个值
要是一个函数想返回俩个值。比如,一个对象结果,一个是排序的状态。在 Kotlin 中的一个紧凑的方案是声明 data 类并返回实例:
1. data class Result(val result: Int, val status: Status)
3. fun function(...): Result {
4. //...
5. return Result(result, status)
6. }
8. val (result, status) = function(...)
数据类自动声明 componentN() 函数
注意:也可以使用标准类 Pair 并让函数返回 ‘Pair‘,但可读性不是很强
例子:多重声明和 Map
转换 map 的最好办法可能是下面这样:
1. for ((key, value) in map) {
3. }
为了让这个可以工作,我们需要
通过提供
iterator()函数序列化呈现 map 通过component1()和component1()函数是把元素成对呈现
事实上,标准库提供了这样的扩展:
1. fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
2. fun <K, V> Map.Entry<K, V>.component1() = getKey()
3. fun <K, V> Map.Entry<K, V>.component2() = getValue()
因此你可以用 for 循环方便的读取 map (或者其它数据集合)
