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. Zurich Gruppe Deutschland, Bonn
  2. MBtech Group GmbH & Co. KGaA, Bremen, Hamburg, Berlin, Braunschweig, Wolfsburg
  3. Aufzugswerke Schmitt+Sohn GmbH & Co. KG, Nürnberg
  4. über Hanseatisches Personalkontor Rhein-Neckar, Mannheim


Anzeige
Top-Angebote
  1. Alte PS4 inkl. Controller + 2 Spiele + 99,99€ = PlayStation 4 Pro (1TB) | +++ACHTUNG+++ Man kann...
  2. 13,99€
  3. 561,11€

Folgen Sie uns
       


  1. HP, Philips, Fujitsu

    Bloatware auf Millionen Notebooks ermöglicht Codeausführung

  2. Mali-C71

    ARM bringt seinen ersten ISP für Automotive

  3. SUNET

    Forschungsnetz erhält 100 GBit/s und ROADM-Technologie

  4. Cisco

    Kontrollzentrum verwaltet Smartphones im Unternehmen

  5. Datenschutz

    Facebook erhält weiterhin keine Whatsapp-Daten

  6. FTTH

    Telekom will mehr Kooperationen für echte Glasfaser

  7. Open Data

    OKFN will deutsche Wetterdaten befreien

  8. Spectrum Next

    Voll kompatible Neuauflage des ZX Spectrum ist finanziert

  9. OmniOS

    Freier Solaris-Nachfolger steht vor dem Ende

  10. Cybercrime

    Computerkriminalität nimmt statistisch gesehen zu



Haben wir etwas übersehen?

E-Mail an news@golem.de


Anzeige
OWASP Top 10: Die zehn wichtigsten Sicherheitsrisiken bekommen ein Update
OWASP Top 10
Die zehn wichtigsten Sicherheitsrisiken bekommen ein Update
  1. Malware Schadsoftware bei 1.200 Holiday-Inn- und Crowne-Plaza-Hotels
  2. Zero Day Exploit Magento-Onlineshops sind wieder gefährdet
  3. Staatstrojaner Office 0-Day zur Verbreitung von Finfisher-Trojaner genutzt

Creators Update: Game Mode macht Spiele runder und Windows 10 ruckelig
Creators Update
Game Mode macht Spiele runder und Windows 10 ruckelig
  1. Microsoft Zwei große Updates pro Jahr für Windows 10
  2. Windows 10 Version 17xx-2 Stromsparmodus kommt für die nächste Windows-Version
  3. Windows as a Service Die erste Windows-10-Version hat noch drei Wochen Support

Linux auf dem Switch: Freiheit kann ganz schön kompliziert sein!
Linux auf dem Switch
Freiheit kann ganz schön kompliziert sein!
  1. Digital Ocean Cloud-Hoster löscht versehentlich Primärdatenbank
  2. Google Cloud Platform für weitere Microsoft-Produkte angepasst
  3. Marktforschung Cloud-Geschäft wächst rasant, Amazon dominiert den Markt

  1. Re: unsrer Vorgehen in der Firma

    3dgamer | 01:39

  2. Re: Confluence ist ohnehin so ein komisches Produkt

    Apfelbrot | 01:06

  3. Re: Bei dem Upload....

    Squirrelchen | 00:49

  4. Re: Ein Gesetz muss her...

    RemoCH | 00:13

  5. Re: kann nicht sein...

    Prinzeumel | 00:04


  1. 19:00

  2. 18:44

  3. 18:14

  4. 17:47

  5. 16:19

  6. 16:02

  7. 15:40

  8. 14:51


  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