为什么我们在 Kotlin 中有名为 componentN 的函数
Why do we have functions that named componentN in Kotlin
我刚刚查看了 Kotlin
standard library 并发现了一些名为 componentN
的奇怪扩展函数,其中 N 是从 1 到 5 的索引。
所有类型的基元都有函数。例如:
/**
* Returns 1st *element* from the collection.
*/
@kotlin.internal.InlineOnly
public inline operator fun IntArray.component1(): Int {
return get(0)
}
对我来说很好奇。我对开发者的动机很感兴趣。调用 array.component1()
而不是 array[0]
更好吗?
这些是 Destructuring Declarations,它们在某些情况下非常方便。
val arr = arrayOf(1, 2, 3)
val (a1, a2, a3) = arr
print("$a1 $a2 $a3") // >> 1 2 3
val (a1, a2, a3) = arr
编译为
val a1 = arr.component1()
val a2 = arr.component2()
val a3 = arr.component3()
Kotlin 有许多函数可以按照约定启用特定功能。您可以使用 operator
关键字来识别它们。示例包括委托、运算符重载、索引运算符以及 解构声明.
函数 componentX
允许在特定 class 上使用解构。您必须提供这些函数才能将 class 的实例解构为其 组件 。很高兴知道 data
classes 默认为每个属性提供这些。
取一个数据classPerson
:
data class Person(val name: String, val age: Int)
它将为每个 属性 提供一个 componentX
函数,以便您可以像这里一样解构它:
val p = Person("Paul", 43)
println("First component: ${p.component1()} and second component: ${p.component2()}")
val (n,a) = p
println("Descructured: $n and $a")
//First component: Paul and second component: 43
//Descructured: Paul and 43
另请参阅我在另一个主题中给出的答案:
我刚刚查看了 Kotlin
standard library 并发现了一些名为 componentN
的奇怪扩展函数,其中 N 是从 1 到 5 的索引。
所有类型的基元都有函数。例如:
/**
* Returns 1st *element* from the collection.
*/
@kotlin.internal.InlineOnly
public inline operator fun IntArray.component1(): Int {
return get(0)
}
对我来说很好奇。我对开发者的动机很感兴趣。调用 array.component1()
而不是 array[0]
更好吗?
这些是 Destructuring Declarations,它们在某些情况下非常方便。
val arr = arrayOf(1, 2, 3)
val (a1, a2, a3) = arr
print("$a1 $a2 $a3") // >> 1 2 3
val (a1, a2, a3) = arr
编译为
val a1 = arr.component1()
val a2 = arr.component2()
val a3 = arr.component3()
Kotlin 有许多函数可以按照约定启用特定功能。您可以使用 operator
关键字来识别它们。示例包括委托、运算符重载、索引运算符以及 解构声明.
函数 componentX
允许在特定 class 上使用解构。您必须提供这些函数才能将 class 的实例解构为其 组件 。很高兴知道 data
classes 默认为每个属性提供这些。
取一个数据classPerson
:
data class Person(val name: String, val age: Int)
它将为每个 属性 提供一个 componentX
函数,以便您可以像这里一样解构它:
val p = Person("Paul", 43)
println("First component: ${p.component1()} and second component: ${p.component2()}")
val (n,a) = p
println("Descructured: $n and $a")
//First component: Paul and second component: 43
//Descructured: Paul and 43
另请参阅我在另一个主题中给出的答案: