¿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()) 
  • ¿Extendiendo la class de datos de Kotlin para usar con JPA?
  • ¿Hay alguna manera de abrir una URL en la window privada / window de Ingognito con Java?
  • Clase de datos que henetworkinga de la class Java
  • ¿Puedo usar @autowire (spring-context) para una aplicación de escritorio kotlin?
  • ¿Hay syntax al igual que #region #endregion en Kotlin?
  • Android: Obtenga un DAO en un ViewModel
  • ¿Se puede usar Flink con Kotlin?
  • Elegir una estrategia a través de la configuration JSON
  • mover una vista dependiendo de la dirección del deslizamiento
  • ¿Es posible acceder a las tipografías de Kotlin desde Java?
  • Hamburger Icon No se muestra