¿Es posible implementar desestructuración personalizada para classs no de datos en Kotlin?

En Kotlin, las classs de datos se pueden desestructurar de la siguiente manera:

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) 

Podría estar malinterpretando los documentos, o tal vez simplemente no pude encontrar un ejemplo, pero estoy buscando una manera de implementar la desestructuración personalizada de classs que no sean de datos. ¿Es esto posible en Kotlin?

Pude hacer que esto funcionara así:

 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 } 

La desestructuración se realiza llamando a las funciones component1 , component2 , component3 , etc., en la instancia que se está desestructurando.

Estas funciones pueden ser funciones miembro declaradas dentro de su class o funciones de extensión. Además, las funciones de los componentes deben tener la palabra key operator para indicar que deben cumplir una convención, es decir, desestructurar una.

Para las classs de datos, el comstackdor genera la function de componente correspondiente para cada propiedad de class de datos declarada en su constructor primario.

Un ejemplo de class con funciones de componentes personalizados:

 class Result(val e: Exception?) { val hasFailed = e != null operator fun component1(): Exception? = e operator fun component2(): Boolean = hasFailed } val (e, hasFailed) = Result(RuntimeException()) 
  • Robolectric KeyStoreKeyGenerator
  • Cambiar / Cuando sin descanso en Kotlin
  • Conjunto de miembros de class (valor) recibe un llamado recursivo ... ¿por qué?
  • Scala require () equivalente en Kotlin
  • "+" En Kotlin Coroutines?
  • ¿Puedo agregar operadores a las classs existentes?
  • ¿Cómo devolvemos valores múltiples de una function en Kotlin como lo hacemos en swift?
  • Usando Mockito doAnswer en Kotlin
  • BadCnetworkingentialsException: no se pudo get el token de acceso con la security de arranque de resorte Oauth2 en GAE
  • kotlin.TypeCastException: null no se puede convertir a un tipo no nulo com.midsizemango.databasekotlin.Note
  • ¿Cómo encadenar transformaciones en Android al usar datos en vivo?