Abo
  • Services:
Anzeige
Rust ist benannt nach dem "rostigem" Pilzbefall auf Pflanzen.
Rust ist benannt nach dem "rostigem" Pilzbefall auf Pflanzen. (Bild: Wikimedia:Smartse - CC-BY-SA 3.0)

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.

Anzeige

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.

 Mozillas Programmiersprache: Rust bedient sich bei der KonkurrenzMakros, Cargo und Ausblick 

eye home zur Startseite
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...



Anzeige

Stellenmarkt
  1. Robert Bosch GmbH, Gerlingen
  2. Adcubum Deutschland GmbH, Stuttgart
  3. AOK - Die Gesundheitskasse für Niedersachsen, Hannover
  4. Daimler AG, Neu-Ulm


Anzeige
Top-Angebote
  1. 299,00€
  2. 47,99€
  3. 29,97€

Folgen Sie uns
       


  1. U-Bahn

    Telefónica baut BTS-Hotels im Berliner Untergrund

  2. Kabelnetz

    Statt auf Docsis 3.1 lieber gleich auf Glasfaser setzen

  3. Virtuelle Güter

    Activision patentiert Förderung von Mikrotransaktionen

  4. Nervana Neural Network Processor

    Intels KI-Chip erscheint Ende 2017

  5. RSA-Sicherheitslücke

    Infineon erzeugt Millionen unsicherer Krypto-Schlüssel

  6. The Evil Within 2 im Test

    Überleben in der Horror-Matrix

  7. S410

    Getacs modulares Outdoor-Notebook bekommt neue CPUs

  8. Smartphone

    Qualcomm zeigt 5G-Referenz-Gerät

  9. Garmin Speak

    Neuer Alexa-Lautsprecher fürs Auto zeigt den Weg an

  10. Datenrate

    Kunden wollen schnelle Internetzugänge



Haben wir etwas übersehen?

E-Mail an news@golem.de


Anzeige
Elektromobilität: Niederlande beschließen Aus für Verbrennungsautos
Elektromobilität
Niederlande beschließen Aus für Verbrennungsautos
  1. World Solar Challenge Regen in Australien verdirbt Solarrennern den Spaß
  2. Ab 2030 EU-Komission will Elektroauto-Quote
  3. Mit ZF und Nvidia Deutsche Post entwickelt autonome Streetscooter

Verschlüsselung: Niemand hat die Absicht, TLS zu knacken
Verschlüsselung
Niemand hat die Absicht, TLS zu knacken
  1. TLS-Zertifikate Zertifizierungsstellen müssen CAA-Records prüfen
  2. Apache-Lizenz 2.0 OpenSSL-Lizenzwechsel führt zu Code-Entfernungen
  3. Certificate Transparency Webanwendungen hacken, bevor sie installiert sind

Zotac Zbox PI225 im Test: Der Kreditkarten-Rechner
Zotac Zbox PI225 im Test
Der Kreditkarten-Rechner

  1. Anbieterbezeichnung so langsam überholt

    Golressy | 02:39

  2. Re: Macht da bitte nicht mit

    sofries | 02:33

  3. Re: Activision patentiert Förderung von Krebs

    sofries | 02:17

  4. Re: Kosten ...

    DAUVersteher | 02:11

  5. Re: 50MBps

    bombinho | 02:01


  1. 19:09

  2. 17:40

  3. 17:02

  4. 16:35

  5. 15:53

  6. 15:00

  7. 14:31

  8. 14:16


  1. Themen
  2. A
  3. B
  4. C
  5. D
  6. E
  7. F
  8. G
  9. H
  10. I
  11. J
  12. K
  13. L
  14. M
  15. N
  16. O
  17. P
  18. Q
  19. R
  20. S
  21. T
  22. U
  23. V
  24. W
  25. X
  26. Y
  27. Z
  28. #
 
    •  / 
    Zum Artikel