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.