Zoeken…


Opmerkingen

Waarom zijn tupels beperkt tot lengte 23?

Tuples worden door de compiler herschreven als objecten. De compiler heeft toegang tot Tuple1 door middel Tuple22 . Deze willekeurige limiet werd bepaald door taalontwerpers.

Waarom tellen tuple-lengtes vanaf 0?

Een Tuple0 is gelijk aan een Unit .

Een nieuwe Tuple maken

Een tupel is een heterogene verzameling van twee tot tweeëntwintig waarden. Een tupel kan worden gedefinieerd met behulp van haakjes. Voor tupels van maat 2 (ook wel een 'paar' genoemd) is er een pijlsyntaxis.

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 is een tupel van maat twee. Gebruik ._1 en met ._22 om toegang te krijgen tot de elementen van een tuple. We kunnen bijvoorbeeld x._1 om toegang te krijgen tot het eerste element van de x tuple. x._2 toegang tot het tweede element. Eleganter kunt u tuple-extractors gebruiken .

De pijlsyntaxis voor het maken van tupels van grootte twee wordt voornamelijk gebruikt in Kaarten, die collecties zijn van (key -> value) paren:

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))

De syntaxis voor het paar op de kaart is de syntaxis van de pijl, waardoor duidelijk wordt dat 1 de sleutel is en a de waarde is die aan die sleutel is gekoppeld.

Tuples binnen collecties

Tuples worden vaak gebruikt binnen collecties, maar ze moeten op een specifieke manier worden behandeld. Bijvoorbeeld, gegeven de volgende lijst met tupels:

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

Het lijkt misschien logisch om de elementen samen te voegen met impliciet tuple-uitpakken:

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

Dit resulteert echter in de volgende fout:

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

Scala kan de tupels niet op deze manier impliciet uitpakken. We hebben twee opties om deze kaart te repareren. De eerste is om de positionele accessors _1 en _2 :

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

De andere optie is om een case statement te gebruiken om de tupels uit te pakken met behulp van patroonovereenkomst:

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

Deze beperkingen gelden voor elke hogere-orde-functie die wordt toegepast op een verzameling tupels.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow