Szukaj…


Uwagi

Dlaczego krotki są ograniczone do długości 23?

Krotki są przepisywane przez kompilator jako obiekty. Kompilator ma dostęp do Tuple1 poprzez Tuple22 . Ten arbitralny limit został ustalony przez projektantów języka.

Dlaczego długości krotek liczą się od 0?

Tuple0 jest równoważne Unit .

Tworzenie nowej krotki

Krotka to heterogeniczny zbiór dwóch do dwudziestu dwóch wartości. Krotkę można zdefiniować za pomocą nawiasów. W przypadku krotek o rozmiarze 2 (zwanych również „parą”) istnieje składnia strzałki.

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 to krotka rozmiaru drugiego. Aby uzyskać dostęp do elementów krotki, użyj ._1 , do ._22 . Na przykład możemy użyć x._1 aby uzyskać dostęp do pierwszego elementu krotki x . x._2 uzyskuje dostęp do drugiego elementu. Bardziej elegancko, możesz użyć ekstraktorów krotkowych .

Składnia strzałki do tworzenia krotek o rozmiarze drugim jest używana głównie w Mapach, które są kolekcjami par (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))

Składnia pary na mapie to składnia strzałki, dzięki czemu jasne jest, że 1 to klucz, a a to wartość związana z tym kluczem.

Krotki w kolekcjach

Krotki są często używane w kolekcjach, ale należy się nimi posługiwać w określony sposób. Na przykład, biorąc pod uwagę następującą listę krotek:

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

Naturalne może się wydawać dodawanie elementów za pomocą niejawnego rozpakowywania krotek:

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

Powoduje to jednak następujący błąd:

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

Scala nie może pośrednio rozpakować krotek w ten sposób. Mamy dwie opcje, aby naprawić tę mapę. Pierwszym z nich jest użycie akcesoriów pozycyjnych _1 i _2 :

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

Inną opcją jest użycie instrukcji case do rozpakowania krotek za pomocą dopasowania wzorca:

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

Ograniczenia te dotyczą każdej funkcji wyższego rzędu stosowanej do zbioru krotek.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow