Suche…


Bemerkungen

Warum sind Tupel auf Länge 23 beschränkt?

Tupel werden vom Compiler als Objekte neu geschrieben. Der Compiler hat Zugriff auf Tuple1 durch Tuple22 . Diese willkürliche Grenze wurde von Sprachdesignern festgelegt.

Warum zählen Tupflängen von 0?

Ein Tuple0 entspricht einer Unit .

Einen neuen Tupel erstellen

Ein Tupel ist eine heterogene Sammlung von zwei bis zweiundzwanzig Werten. Ein Tupel kann mit Klammern definiert werden. Für Tupel der Größe 2 (auch als "Paar" bezeichnet) gibt es eine Pfeilsyntax.

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 ist ein Tupel der Größe zwei. Um auf die Elemente eines Tupels ._1 , verwenden Sie ._1 bis ._22 . Mit x._1 können wir x._1 auf das erste Element des x Tupels zugreifen. x._2 greift auf das zweite Element zu. Eleganter können Sie Tupel-Extraktoren verwenden .

Die Pfeilsyntax zum Erstellen von Tupeln der Größe zwei wird hauptsächlich in Maps verwendet. Hierbei handelt es sich um Sammlungen von (key -> value) -paaren:

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

Die Syntax für das Paar in der Map ist die Pfeilsyntax. Damit wird klar, dass 1 der Schlüssel und a der mit diesem Schlüssel verknüpfte Wert ist.

Tupel in Sammlungen

Tupel werden häufig in Sammlungen verwendet, müssen jedoch auf bestimmte Weise gehandhabt werden. Geben Sie beispielsweise die folgende Liste von Tupeln an:

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

Es kann naheliegend sein, die Elemente durch implizites Entpacken des Tupels zusammenzufügen:

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

Dies führt jedoch zu folgendem Fehler:

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

Scala kann die Tupel auf diese Weise nicht implizit auspacken. Wir haben zwei Möglichkeiten, diese Karte zu reparieren. Die erste besteht darin, die Positionszugriffe _1 und _2 :

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

Die andere Option ist die Verwendung einer case Anweisung zum Entpacken der Tupel mithilfe von Mustervergleich:

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

Diese Einschränkungen gelten für alle Funktionen höherer Ordnung, die auf eine Sammlung von Tupeln angewendet werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow