Возможно ли реализовать индивидуальное деструктурирование для не-класса данных в Котлин?

В классах данных Kotlin можно деструктурировать так:

fun main(args: Array<String>) { val thing = Stuff(1, "Hi", true) val(thing1, thing2, thing3) = thing println(thing1) } data class Stuff(val thing1: Int, val thing2: String, val thing3: Boolean) 

Я мог бы неправильно интерпретировать документы, или, может быть, просто не смог найти пример, но я ищу способ реализовать произвольное деструктурирование классов, отличных от данных. Возможно ли это в Котлине?

Я смог сделать эту работу следующим образом:

 fun main(args : Array<String>) { val person = Person("first", "last") val(param1, param2) = person println(param1) println(param2) } class Person(val firstName: String, val lastName: String) { operator fun component1() = firstName operator fun component2() = lastName } 

Деструктурирование выполняется путем вызова функций component1 , component2 , component3 т. Д., В случае деструктурированного экземпляра.

Эти функции могут быть либо функциями-членами, объявленными внутри вашего класса, либо функциями расширения. Кроме того, функции компонента должны иметь ключевое слово operator чтобы указать, что они должны удовлетворять соглашению, а именно деструктурировать его.

Для классов данных компилятор генерирует соответствующую функцию компонента для каждого свойства класса данных, объявленного в его основном конструкторе.

Пример класса с пользовательскими компонентами:

 class Result(val e: Exception?) { val hasFailed = e != null operator fun component1(): Exception? = e operator fun component2(): Boolean = hasFailed } val (e, hasFailed) = Result(RuntimeException()) 
Intereting Posts
Ни один из следующих кандидатов не отвечает из-за несоответствия типа приемника Тест для Android в котлинском царстве Нужно ли сначала изучать java, чтобы узнать kotlin? Или я могу начать его напрямую? Ошибка: не удалось разрешить версию для зависимости «org.jetbrains.kotlin: kotlin-stdlib-jre7: jar ' Android Keystore? .getKey возвращает null на некоторых устройствах Экземпляр класса Kotlin assertEqual Как организовать файлы ресурсов макета в Android Studio? Kotlin: @JvmStatic метод NoClassDefFoundError / ClassNotFoundException во время модульного теста Самый простой способ преобразования строки в HashMap Поддержка градиента протокола Buffer для Kotlin Android не работает? Kotlin / Android: возвращение может быть отменено из «когда» Как создать экземпляр объекта с использованием значений параметров конструктора по умолчанию в Kotlin? Как запустить код, если объект имеет значение null? Что означает <ClassName>. () В Котлине? Преобразование XML в Anko DSL