解析声明:容许展开单个复合值,并使用它来初始化多个单独的变量。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