为什么我们有在Kotlin中命名为componentN的函数?

我刚刚看了Kotlin 标准库 ,发现了一些奇怪的扩展函数叫做componentN ,其中N是从1到5的索引。

有所有types的原语的函数。 例如:

 /** * Returns 1st *element* from the collection. */ @kotlin.internal.InlineOnly public inline operator fun IntArray.component1(): Int { return get(0) } 

它看起来好奇。 我对开发者的动机很感兴趣。 调用array.component1()而不是array[0]更好吗?

Kotlin有许多function,可按照惯例启用特定的function。 您可以通过使用operator关键字来识别这些。 例子是委托,操作符重载,索引操作符和解构声明

函数componentX允许在特定的类上使用解构。 您必须提供这些function才能将该类的实例解构成其组件 。 很高兴知道data类默认为每个属性提供这些属性。

以数据类Person

 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 

另请参阅我在另一个线程中给出的答案:

https://stackoverflow.com/a/46207340/8073652

这些是解构声明 ,在某些情况下非常方便。

 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()