# 解構聲明
有時一個對象會很方便地解構到一系列變量中,例如:
``` kotlin
val (name, age) = person
```
這種語法稱為_解構聲明_。解構聲明一次性創建多個變量。我們已經聲明了兩個新變量:`name` 和 `age`,并能夠獨立地使用它們:
``` kotlin
println(name)
println(age)
```
解構聲明會編譯成下面的代碼:
``` kotlin
val name = person.component1()
val age = person.component2()
```
這里的 `component1()` and `component2()` 函數是在 Kotlin 廣泛使用的_約定原則_(查看運算符,如 `+` 和 `*`,`for` 循環等等。)。解構聲明的右手邊可以是任何東西,只要有必需數量的 component 函數能在它上面調用。而且理所當然地是 `component3()` 和 `component4()`,以此類推。
注意 `componentN()` 函數需要與 `operator` 關鍵字一起標記以允許在解構聲明中使用它們。
解構聲明也在 `for` 循環中工作:當你說
``` kotlin
for ((a, b) in collection) { ... }
```
變量 `a` 和 `b` 獲得在集合的元素上調用 `component1()` 和 `component2()` 而返回的值。
## 示例:從一個函數返回兩個值
讓我們說說我們需要從一個函數返回兩個東西。例如,一定順序下的一個結果對象和一個狀態。Kotlin 中做這件事的一個簡便的方式是聲明一個[數據類](data-classes.html)并返回它的實例:
``` kotlin
data class Result(val result: Int, val status: Status)
fun function(...): Result {
// 計算
return Result(result, status)
}
// 現在,要使用這個函數:
val (result, status) = function(...)
```
數據類自動地聲明 `componentN()` 函數,這里解構聲明可以正常工作。
**注意**:我們也能使用標準類 `Pair` 并有 `function()` 返回 `Pair<Int, Status>`,但它往往有更好的數據命名屬性。
## 示例:解構聲明和映射
或許遍歷一個映射最佳的方式是這樣的:
``` kotlin
for ((key, value) in map) {
// 拿這對鍵和值做點什么
}
```
要讓這正常工作,我們得
* 通過提供一個 `iterator()` 函數讓映射表現得像一個隊列值,
* 通過提供函數 `component1()` and `component2()` 讓每組元素表現得像一對。
而且事實上,標準庫提供了這些擴展:
``` kotlin
operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
operator fun <K, V> Map.Entry<K, V>.component1() = getKey()
operator fun <K, V> Map.Entry<K, V>.component2() = getValue()
```
因此你可以在有映射 `for` 循環(數據類實例的集合等等也一樣)中自由地使用解構聲明。