Buscar..


Observaciones

¿Por qué las tuplas se limitan a la longitud 23?

Las tuplas son reescritas como objetos por el compilador. El compilador tiene acceso a Tuple1 través de Tuple22 . Este límite arbitrario fue decidido por los diseñadores de idiomas.

¿Por qué las longitudes de la tupla cuentan desde 0?

Un Tuple0 es equivalente a una Unit .

Creando un nuevo tuple

Una tupla es una colección heterogénea de dos a veintidós valores. Una tupla se puede definir utilizando paréntesis. Para tuplas de tamaño 2 (también llamadas 'par') hay una sintaxis de flecha.

scala> val x = (1, "hello") 
x: (Int, String) = (1,hello)
scala> val y = 2 -> "world" 
y: (Int, String) = (2,world)
scala> val z = 3 → "foo"     //example of using U+2192 RIGHTWARD ARROW
z: (Int, String) = (3,foo)

x es una tupla de tamaño dos. Para acceder a los elementos de una tupla use ._1 , a través de ._22 . Por ejemplo, podemos usar x._1 para acceder al primer elemento de la tupla x . x._2 accede al segundo elemento. Más elegantemente, puedes usar extractores de tuplas .

La sintaxis de la flecha para crear tuplas de tamaño dos se usa principalmente en Mapas, que son colecciones de pares (key -> value) :

scala> val m = Map[Int, String](2 -> "world")
m: scala.collection.immutable.Map[Int,String] = Map(2 -> world)

scala> m + x
res0: scala.collection.immutable.Map[Int,String] = Map(2 -> world, 1 -> hello)

scala> (m + x).toList
res1: List[(Int, String)] = List((2,world), (1,hello))

La sintaxis para el par en el mapa es la sintaxis de la flecha, dejando claro que 1 es la clave y a es el valor asociado con esa clave.

Tuplas dentro de las colecciones

Las tuplas se usan a menudo dentro de las colecciones, pero deben manejarse de una manera específica. Por ejemplo, dada la siguiente lista de tuplas:

scala> val l = List(1 -> 2, 2 -> 3, 3 -> 4)
l: List[(Int, Int)] = List((1,2), (2,3), (3,4))

Puede parecer natural agregar los elementos juntos mediante el desempaquetado implícito de la tupla:

scala> l.map((e1: Int, e2: Int) => e1 + e2)

Sin embargo, esto resulta en el siguiente error:

<console>:9: error: type mismatch;
 found   : (Int, Int) => Int
 required: ((Int, Int)) => ?
              l.map((e1: Int, e2: Int) => e1 + e2)

Scala no puede desempaquetar implícitamente las tuplas de esta manera. Tenemos dos opciones para arreglar este mapa. El primero es usar los _1 posicionales _1 y _2 :

scala> l.map(e => e._1 + e._2)
res1: List[Int] = List(3, 5, 7)

La otra opción es usar una declaración de case para descomprimir las tuplas usando un patrón de coincidencia:

scala> l.map{ case (e1: Int, e2: Int) => e1 + e2}
res2: List[Int] = List(3, 5, 7)

Estas restricciones se aplican a cualquier función de orden superior aplicada a una colección de tuplas.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow