Saltar al contenido

Kotlin cuádruple, quíntuple, etc. para desestructurar

Nuestros mejores programadores agotaron sus reservas de café, por su búsqueda diariamente por la solución, hasta que Gloria halló el resultado en GitLab así que hoy la compartimos con nosotros.

Solución:

Lo esencial

veamos como desestructurar obras:

Kotlin define una convención para esto, es decir componentX()operator Las funciones son un ejemplo del principio de convenciones utilizado en Kotlin en muchos lugares. Estos componentX() Las funciones son utilizadas por el compilador para la inicialización de variables en las declaraciones de desestructuración.

por ejemplo en Pair estas funciones se ven de la siguiente manera:

operator fun component1(): A = first 

operator fun component2(): B = second

Como puedes ver estos son operators, funciones especialmente manejadas. Estos componentX() El desarrollador puede proporcionar funciones y el compilador las producirá automáticamente para data clases Pair también es tal data clase por cierto.

Respuesta

Por lo tanto, simplemente siga adelante y use data clases siempre que necesites más de un Triple.

Por ejemplo, una clase MultiComponent definido como esto:

data class MultiComponent(val x: Int, val y: Int, val z: Int, val a: Int, val b: Int, val c: Int)

será compilado a una clase con funciones component1(), component2(), …, component6() y se puede utilizar en declaraciones de desestructuración:

val (q, w, e, r, t, z) = MultiComponent(1, 2, 3, 4, 5, 6)

Encontré que era más fácil simplemente codificar las n-tuplas necesarias. El caso de uso fue métodos de extensión funcional para cosas como memorización, etc.

data class NTuple2(val t1: T1, val t2: T2)

data class NTuple3(val t1: T1, val t2: T2, val t3: T3)

data class NTuple4(val t1: T1, val t2: T2, val t3: T3, val t4: T4)

data class NTuple5(val t1: T1, val t2: T2, val t3: T3, val t4: T4, val t5: T5)

data class NTuple6(val t1: T1, val t2: T2, val t3: T3, val t4: T4, val t5: T5, val t6: T6)

Y luego generar los ayudantes de construcción necesarios:

infix fun  T1.then(t2: T2): NTuple2

    return NTuple2(this, t2)


infix fun  NTuple2.then(t3: T3): NTuple3

    return NTuple3(this.t1, this.t2, t3)


infix fun  NTuple3.then(t4: T4): NTuple4

    return NTuple4(this.t1, this.t2, this.t3, t4)


infix fun  NTuple4.then(t5: T5): NTuple5

    return NTuple5(this.t1, this.t2, this.t3, this.t4, t5)


infix fun  NTuple5.then(t6: T6): NTuple6

    return NTuple6(this.t1, this.t2, this.t3, this.t4, this.t5, t6)

Entonces podría hacer:

val nTuple4 = 1 then 2 then "foo" then "bar"

Resultando en:

val nTuple4: NTuple4

A diferencia de Scala, Kotlin no tiene n-tuplas para valores superiores a 3 definidos. Has identificado correctamente Pair y Triple.

Kotlin favorece el uso de clases de datos para estos casos de uso, según esta publicación de blog. Así que sí, tendrás que definir una clase de datos para hacer lo que quieras, no hay Quadruple. Personalmente, diría que definir su propia clase de datos es más claro y terminará siendo compilado y utilizado de la misma manera que un hipotético Quadruple de todos modos, debajo de las sábanas.

En cuanto a la desestructuración de clases de datos, Kotlin también lo admite:

data class Thingy(val a: String, val b: String, val c: String, val d: String)
val t = Thingy("A", "B", "C", "D")
val (aa, bb, cc, dd) = t

Sección de Reseñas y Valoraciones

Eres capaz de añadir valor a nuestro contenido asistiendo con tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *