Почему у нас есть функции, которые назвали componentN в Котлине

Я только что просмотрел стандартную библиотеку Kotlin и нашел некоторые странные функции расширения, называемые 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] ?

У Kotlin есть много функций, позволяющих использовать определенные функции по соглашению. Вы можете идентифицировать их с помощью ключевого слова operator . Примерами являются делегаты, операторы перегрузки, оператор индексирования, а также деструктурирующие объявления .

Функции componentX позволяют использовать деструктурирование для определенного класса. Вы должны предоставить эти функции, чтобы иметь возможность разрушать экземпляры этого класса в своих компонентах . Хорошо знать, что классы 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

Это объявления Destructuring, и в некоторых случаях они очень удобны.

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