解析聲明:容許展開單個複合值,並使用它來初始化多個單獨的變量。markdown
>>> val p = Point(10, 20)
>>> val (x, y) = p
>>> println(x)
10
>>> println(y)
20
複製代碼
解析聲明用到了約定的原理。要在解構聲明中初始化每一個變量,將調用名爲componentN
的函數,其中N
是聲明中變量的位置。函數
val (a, b) = p -------> val a = p.component1()
val b = p.component2()
複製代碼
使用場景:測試
// 聲明一個數據類來持有值
data class NameComponents(val name:String, val extension: String)
fun splitFilename(fullName: String): NameComponents {
val result = fullName.split('.', limit = 2)
// 返回一個數量類型的實例
return NameComponents(result[0], result[1])
}
// 測試
// 使用解構聲明來展開這個類
>>> val (name, ext) = splitFilename("example.kt")
>>> println(name)
example
>>> println(ext)
kt
複製代碼
data class NameComponents(val name:String, val extension: String)
fun splitFilename(fullName: String): NameComponents {
val (name, extension) = fullName.split('.', limit = 2)
return NameComponents(name, extension)
}
複製代碼
注意:標準庫只容許使用此語法來訪問一個對象的前五個元素。spa
// 定義
fun printEntries(map: Map<String, String>) {
// 在in循環中用解構聲明
for((key, value) in map) {
println("$key -> $value")
}
}
// 測試
>>> val map = mapOf("Oracle" to "Java", "JetBrains" to "Kotlin")
>>> printEntries(map)
Oracle -> Java
JetBrains -> Kotlin
複製代碼
上述例子用到了兩個Kotlin約定:code