W Scali, krotka (ang. tuple) to klasa, która przechowuje elementy różnych typów. Krotki są niezmienne.
Krotki przydają się, gdy chcemy, żeby funkcja zwróciła jednocześnie wiele wartości.
Krotki tworzy się w następujący sposób:
val ingredient = ("Sugar" , 25): Tuple2[String, Int]
Powyższy kod tworzy krotkę zawierającą element typu String oraz typu Int.
W Scali krotki reprezentowane są przez szereg klas: Tuple2, Tuple3 itd. aż do Tuple22. Za każdym razem, kiedy tworzymy krotkę zawierającą n elementów (n musi zawierać się w przedziale od 2 do 22), Scala tworzy instancję jednej z odpowiadających klas z grupy TupleN i parametryzuje ją odpowiednimi wartościami. W ww. przykładzie jest to Tuple2[String, Int]
.
Dostęp do elementów
Krotka zapewnia dostęp do swoich elementów z użyciem składni podkreślnika (underscore). tuple._n
odwołuje się do n-tego elementu w kolejności (pod warunkiem, że dana krotka zawiera tyle elementów).
println(ingredient._1) // wyświetli Sugar println(ingredient._2) // wyświetli 25
Dekonstrukcja krotki
Krotki w Scali wspierają dekonstrukcję
val (name, quantity) = ingredient println(name) // wyświetli Sugar println(quantity) // wyświetli 25
Dekonstrukcja krotek może być bardzo przydatna w dopasowywaniu wzorców (ang. pattern matching)
val planetDistanceFromSun = List( ("Mercury", 57.9), ("Venus", 108.2), ("Earth", 149.6), ("Mars", 227.9), ("Jupiter", 778.3) ) planetDistanceFromSun.foreach { case ("Mercury", distance) => println(s"Merkury jest $distance milionów km od Słońca") case p if p._1 == "Venus" => println(s"Wenus jest ${p._2} milionów km od Słońca") case p if p._1 == "Earth" => println(s"Niebieska Planeta jest ${p._2} milionów km od Słońca") case _ => println("Zbyt daleko...") }
Ma ona też zastosowanie w wyrażeniach ‘for’.
val numPairs = List((2, 5), (3, -7), (20, 56)) for ((a, b) <- numPairs) { println(a * b) }
Wartość ()
typu Unit
jest koncepcyjnie taka sama jak wartość ()
typu Tuple0
. Może być tylko jedna wartość tego typu, ponieważ nie zawiera żadnych elementów.
Użytkownicy mogą czasami mieć trudności z wyborem pomiędzy krotkami (tuple) i klasami przypadków (case class). Zazwyczaj klasy przypadków są preferowane wtedy, kiedy elementy niosą ze sobą jakieś większe znaczenie. ``