Sök…


Anmärkningar

Varför är tuples begränsade till längd 23?

Tuples skrivs om som objekt av kompilatorn. Kompilatorn har åtkomst till Tuple1 till Tuple22 . Denna godtyckliga gräns bestämdes av språkdesigners.

Varför räknas tupellängderna från 0?

En Tuple0 motsvarar en Unit .

Skapa en ny Tuple

En tupel är en heterogen samling av två till tjugotvå värden. En tupel kan definieras med hjälp av parenteser. För tupar i storlek 2 (kallas också ett "par") finns det en pilsyntax.

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 är en tupel i storlek två. För att få tillgång till elementen i en tuple, använd ._1 , genom ._22 . Vi kan till exempel använda x._1 att komma åt det första elementet i x tupeln. x._2 öppnar det andra elementet. Mer elegant kan du använda tuple-extraherare .

Pilsyntaxen för att skapa tuples i storlek två används främst i Kartor, som är samlingar av (key -> value) par:

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

Syntaxen för paret på kartan är pilsyntaxen, vilket gör det klart att 1 är nyckeln och a är värdet associerat med den tangenten.

Tuples inom samlingar

Tuples används ofta inom samlingar men de måste hanteras på ett specifikt sätt. Till exempel, med följande lista över tuples:

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

Det kan verka naturligt att lägga till elementen tillsammans med implicit tuple-packning:

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

Detta resulterar dock i följande fel:

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

Scala kan inte implicit packa upp tupplarna på detta sätt. Vi har två alternativ för att fixa den här kartan. Den första är att använda positionstillbehören _1 och _2 :

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

Det andra alternativet är att använda en case uttalande att packa tuplerna som använder mönstermatchning:

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

Dessa begränsningar gäller för alla högre ordningsfunktioner som tillämpas på en samling tuples.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow