• IT-Karriere:
  • Services:

Musterhaft und klassenlos

Rust bedient sich ausgiebig beim Repertoire anderer Sprachen. So verwendet sie wie die funktionalen Programmiersprachen Haskell und Standard ML Muster - und dies in zahlreichen Kontexten. Mit Hilfe des Musters (x,y,z) auf der linken Seite der Zuweisung let (x,y,z) = (1,2,3); deklariert die Anweisung die drei Variablen x, y und z auf einen Schlag. Diese auch als Destructuring Assignment bekannte Anweisung weist x den Wert 1, y die 2 und z die 3 zu.

Stellenmarkt
  1. operational services GmbH & Co. KG, Dresden, Berlin, Frankfurt am Main, München
  2. PULSION Medical Systems SE - GETINGE Group, Feldkirchen bei München

Der Match-Ausdruck im nächsten Code verwendet in den Zeilen 2 und 3 jeweils ein Muster zur Fallunterscheidung links neben dem =>-Operator. Ergibt der Ausdruck x in Zeile 1 den Wert 0, speichert die Variable w die Summe aus y und z. In jedem anderen Fall speichert w das Produkt aus den Werten der beiden Variablen.

Mustererkennung

01 let w = match x {
02     0 => y+z,
03     _ => y*z
04 }

Klassenlos

Rust 1.0 lässt das Konzept der Klassen wieder fallen. Anstelle von Klassendefinitionen arbeitet Version 1.0 mit benutzerdefinierten, zusammengesetzten Datentypen, die sie bei Bedarf um Methoden ergänzt. Das Schlüsselwort struct leitet zu Beginn des folgenden Beispiels die Definition des benutzerdefinierten Datentyps Container ein. Eine Instanz von Container speichert dabei in Zeile 2 intern einen Vektor aus 64 Bit breiten Fließkommazahlen im Feld content.

Anwendungsdaten ohne Klassen (impl.rs)

01 struct Container {
02   content: Vec<f64>
03 }
04
05 impl Container {
06   fn print_content(&self) {
07     println!("Der Container speichert {} Floats", \
                        self.content.len());
08   }
09 }
10
11 fn main() {
12   let c = Container {
13      content: vec!(1.0, 2.0, 3.0)
14   };
15
16   c.print_content();
17 }

Der Block nach dem Schlüsselwort impl ab Zeile 5 definiert die zum Datentyp Container passende Methode, so etwa print_content() (Zeilen 6 bis 8). Sie übernimmt dank der Variablen self eine Referenz auf sich selbst.

Die Zeile danach gibt die Anzahl der in content gespeicherten Fließkommazahlen mit Hilfe des Makros println über die Standardausgabe in der Shell aus. Dabei formatiert sie das Ergebnis auch gleich. Bevor das Makro dies allerdings tut, ersetzt Rust den Platzhalter {} in der Zeichenkette durch den Wert des Methoden-Aufrufs len für den Vektor aus der Komponente content.

Im Hauptteil des Programms erzeugt Zeile 12 die Variable c vom Typ Container. Den Vektor, den die Komponente content speichert, erhält sie in Zeile 13 nach dem Doppelpunkt. Ihn erzeugt ebenfalls ein Makro. Zeile 16 bringt anhand der bekannten Punktnotation noch die Methode print_content() ins Spiel. Übersetzt ein Entwickler nun die Datei impl.rs über rustc impl.rs und führt sie anschließend aus, erscheint die Meldung "Der Container speichert 3 Floats" in der Shell.

Traits

Traits dienen der Code-Abstraktion über die Grenzen von Datentypen hinweg. Sie sorgen dafür, dass Entwickler generische Funktionen ähnlich wie die Typklassen aus der funktionalen Programmiersprache Haskell nutzen können.

Der folgende Code erzeugt den Trait Dimension, der in Zeile 2 lediglich die Signatur fn volume(&self) -> f64; der Methode volume() festlegt. Implementierungen folgen in Zeile 9 für eine Kugel (Datentyp Sphere) und in Zeile 15 für einen Würfel (Datentyp Cube).

Körperberechnungen (trait.rs)

01 trait Dimension {
02   fn volume(&self) -> f64;
03 }
04
05 struct Sphere {
06   radius: f64
07 }
08
09 impl Dimension for Sphere {
10   fn volume(&self) -> f64 {
11     4.0/3.0 * std::f64::consts::PI * cubic(self.radius)
12   }
13 }
14
15 struct Cube {
16   side: f64
17 }
18
19 impl Dimension for Cube {
20   fn volume(&self) -> f64 {
21     cubic(self.side)
22   }
23 }
24
25 fn print_volume<T: Dimension>(obj: T) {
26   println!("Das Objekt hat das Volumen von {}", obj.volume());
27 }
28
29 fn cubic(x: f64) -> f64 {
30   x * x * x
31 }
32
33 fn main() {
34   print_volume(Sphere { radius: 1.0});
35   print_volume(Cube { side: 1.0 });
36 }

Die Signatur (Zeile 2) spielt eine Rolle, weil sie sich auf die Methode volume() auswirkt, die der Code ab Zeile 10 für den Datentyp Sphere definiert. Zeile 11 berechnet das Kugelvolumen und liest den benötigten Radius aus dem gleichnamigen Feld. Für den Datentyp Cube wird in den Zeilen 19 bis 23 analog vorgegangen.

Die Hauptroutine des Programms ab Zeile 33 ruft die generische Funktion print_volume() jeweils mit einem Wert für die Datentypen Sphere und Cube auf. Hierbei lässt sich jeder Wert übernehmen, dessen zugehörigen Datentyp der Trait Dimension implementiert. Um dies zu vereinbaren, wird in Zeile 25 nach der abstrakten Typvariablen T und dem Doppelpunkt der Name des Trait genannt.

Ruft das Programm dann print_volume() auf, kommt die Methode volume() mit dem jeweils passenden Datentyp zum Einsatz. Das Ergebnis gibt wieder das Makro println aus.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Mozillas Programmiersprache: Rust bedient sich bei der KonkurrenzMakros, Cargo und Ausblick 
  1.  
  2. 1
  3. 2
  4. 3
  5.  


Anzeige
Spiele-Angebote
  1. 19,49€
  2. 25,99€
  3. (u. a. Death Stranding für 39,99€, Bloodstained: Ritual of the Night für 17,99€, Journey to...
  4. 59,99€ / Retail: 52,63€

Baron Münchhausen. 19. Jul 2015

Deswegen hat er auch "war" hinzugefügt :)

grorg 18. Jul 2015

Wenn du damit auf das "Zitat" von Bill Gates ansprichst - das gab es nie und ist frei...

grorg 18. Jul 2015

Wir reden hier über eine Programmiersprache und nicht Picasso ....... zeig doch mal, wie...

esgeh 17. Jul 2015

In Rust wird dir genausowenig wie in C eine "Indirektion" aufgezwungen. Wenn du...

flasherle 17. Jul 2015

nur das bei reeller umsetzung das ganze durch die namensgebung leicht lesbar wird...


Folgen Sie uns
       


Freebuds Pro im Test: Huaweis bester ANC-Hörstöpsel schlägt die Airpods Pro nicht
Freebuds Pro im Test
Huaweis bester ANC-Hörstöpsel schlägt die Airpods Pro nicht

Die Freebuds Pro haben viele Besonderheiten der Airpods Pro übernommen und sind teilweise sogar besser. Trotzdem bleiben die Apple-Stöpsel etwas Besonderes.
Ein Test von Ingo Pakalski

  1. Galaxy Buds Live im Test So hat Samsung gegen Apples Airpods Pro keine Chance
  2. Freebuds Pro Huawei bringt eine Fast-Kopie der Airpods Pro
  3. Airpods Studio Patentanträge bestätigen Apples Arbeit an ANC-Kopfhörer

Probefahrt mit Citroën Ami: Das Palindrom auf vier Rädern
Probefahrt mit Citroën Ami
Das Palindrom auf vier Rädern

Wie fährt sich ein Elektroauto, das von vorne und hinten gleich aussieht und nur 7.000 Euro kostet?
Ein Hands-on von Friedhelm Greis

  1. Zulassungsrekord Jeder achte neue Pkw fährt elektrisch
  2. Softwarefehler Andere Marken laden gratis an Teslas Superchargern
  3. Lucid Motors Elektrolimousine Lucid Air kostet 170.000 US-Dollar

IT-Freelancer: Der kürzeste Pfad zum nächsten Projekt
IT-Freelancer
Der kürzeste Pfad zum nächsten Projekt

Die Nachfrage nach IT-Freelancern ist groß - die Konkurrenz aber auch. Der nächste Auftrag kommt meist aus dem eigenen Netzwerk oder von Vermittlern. Doch wie findet man den passenden Mix?
Ein Bericht von Manuel Heckel

  1. Selbstständiger Sysadmin "Jetzt fehlen nur noch die Aufträge"

    •  /