*println! bei komplexen Datentypen
*Komplexe Datentypen 1: Das Tuple
*Der Index
Bevor wir mit den Tuples anfangen, noch ein kleiner Hinweis zur Ausgabe.
Komplexe Datentypen, wie ein Tuple, brauchen eine etwas geänderte Form
der Ausgabe. Wenn das Tuple x heißt, würde es so aussehen:
println!("{:?}",x);
oder, wie letztens erwähnt:
println!("{x:?}");
Was sind die Grundinformationen für ein Tuple? Ein Tuple kann verschiedene Datentypen aufnehmen (welche die wir schon kennen und auch noch unbekannte komplexe Datentypen). Die Länge eines Tuples ist nach der Erstellung fix. Selbst ein mutable (mut) kann das nicht ändern, ebenfalls wird der Datentyp konstant gehalten, sobald er im Index (der Reihung) steht.
Um das mal zu verdeutlichen:
(hab ich eigentlich schon gesagt, dass man bis auf gewisse Regeln und Konventionen Variablennamen immer selbst gestalten kann? Hauptsache man versteht was damit gemeint ist.) Dh. jede Variable, die ich hier schreibe, könntet ihr auch wumstibumsti1 usw. nennen. Wichtig ist nur, dass ihr euch merkt wofür ihr sie gedacht habt.
Also zum Tuple; Ein Muster:
let variablen_name = (item1,item2,item3...usw...);
Die Elemente eines Tuples stehen also einfach in runden Klammern und sind mit Beistrichen getrennt.
let inhalt = (1,2.0,'c',true);
Hier befinden sich im Tuple also ein Integer, ein Float, ein Char, und ein Boolwert. Es sind 4 Elemente. Und es bleiben 4 Elemente. Allerdings, wie Eingangs beschrieben, kann man diese selbst ändern. Vorausgesetzt das Tuple hat ein mut beigefügt. ABER! der Datentyp muss gleich bleiben.
Wozu braucht man das? Etwas später kommen wir zu Bereichen, wo die einen Elemente andere Elemente abfragen und davon ausgehen, dass auf einem bestimmten Index, etwas Bestimmtes zu erwarten ist. Gehen wir mal von einem Register aus, wo bspw. der Name und eine Adresse abgefragt wird. Wenn an der gewohnten Stelle keine Hausnummer stünde, hätten wir ein Problem. Das bringt mich zum nächsten wichtigen Punkt. Den INDEX!
Das sollte vielleicht vorher noch geklärt sein, bevor wir weitermachen.
Einfach ausgedrückt, beschreibt der Index die Position eines Elements, innerhalb einer Werteliste. Dabei ist wichtig zu beachten, dass der allererste Index immer 0 ist, nicht 1. In unserem obigen Beispiel waren es 4 Elemente. 1,2.0,'c' und true. In Indizes (Mehrzahl von Index) von 0 bis 3. Wenn man auf ein bestimmtes Element in einem Tuple zugreifen will, wird das über den gewünschten Index gemacht. Und zwar einfach mit einem Punkt nach dem Variablennamen. zB.
inhalt.2='d';
Somit wird das 'c' an dritter Position (2ter Index) auf 'd' geändert. Einmal noch zur Erinnerung. Der Wert des Index darf geändert werden, nicht der Datentyp selbst. Bei
inhalt.2=4.0;
wirft der Compiler einen Fehler aus. Das mag er gar nicht.
Dieser gibt zurück, dass er einen Buchstaben(char) erwartet hätte, aber eine Gleitkommazahl(float) vorzufinden war.
Ein weiterer Mechanismus eines Tuples und auch der Letzte für diesen Abschnitt, ist die Dekonstruierung. Er beschreibt den Vorgang, die verschiedenen Elemente eines Tuples in einzelne Variablen zu speichern. Dabei baut man neue Variablen in einer runden Klammer und verbindet sie mit einem Gleichzeitszeichen mit dem Tuple.
let (a,b,c,d) = inhalt
Schon sind in a,b,c und d einzeln die Werte vom Tuple(Inhalt) gespeichert.
Wichtig dabei ist aber, dass das Extrahieren in einzelne Variablen nur für diese Variablen gilt. Wird der Wert der Variable (mut vorausgesetzt) geändert, ändert sich das Tuple selbst nicht.
Wie sieht das dann tatsächlich aus?
Ausgabe:
Man kann auch bei der Variable d (das war auch für die anderen, die nicht im Screen sind) sehen, dass der Compiler davor warnt, wenn Variablen(also, b,c und d) nicht verwendet werden. Die kann man per Konvention vorher mit einem Unterstrich versehen(wenn man will).