Scala Language
Krotki
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.