beispiel-programme_in_rust
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| beispiel-programme_in_rust [2021-10-18 15:51:17] – manfred | beispiel-programme_in_rust [2022-04-15 22:00:02] (aktuell) – [was ich noch mit Rust lernen möchte/muß] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== Beispiel-Programme in Rust ====== | ====== Beispiel-Programme in Rust ====== | ||
| - | * [[http://rustbyexample.com/ | + | * [[https://doc.rust-lang.org/ |
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| - | ===== Allgemeines zu Rust ===== | + | ===== meine Kode-Beispiele ===== |
| - | + | ||
| - | //Buch: [[https:// | + | |
| - | + | ||
| - | Die folgenden | + | |
| - | > rustc -V | + | |
| - | rustc 1.48.0 | + | |
| - | + | ||
| - | > uname -a | + | |
| - | FreeBSD erde.lan 13.0-RELEASE FreeBSD 13.0-RELEASE #6 releng/ | + | |
| - | + | ||
| - | hier wird die Variable '' | + | |
| - | fn main() { | + | |
| - | let a = 12; | + | |
| - | println!(" | + | |
| - | + | ||
| - | let a = 33; | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | das geschied durch das vorangestellte Schlüsselwort '' | + | |
| - | denn eine " | + | |
| - | Will man eine Variable, die sich verändern läßt, dann benötigt man noch das Schlüsselwort '' | + | |
| - | fn main() { | + | |
| - | let mut a = 12; | + | |
| - | println!(" | + | |
| - | + | ||
| - | a = 33; | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | und dann gibt es noch die " | + | |
| - | Nur worin besteht der Unterschied zwischen " | + | |
| - | " | + | |
| - | muß man ihnen immer einen Typ zuweisen. | + | |
| - | fn main() { | + | |
| - | const PI: f32 = 3.1416; | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | " | + | |
| - | const PI: f32 = 3.1416; | + | |
| - | + | ||
| - | fn main() { | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | + | ||
| - | ==== Ausgabe ==== | + | |
| - | + | ||
| - | **'' | + | |
| - | + | ||
| - | **'' | + | |
| - | + | ||
| - | siehe auch: | + | |
| - | * [[https:// | + | |
| - | * [[https:// | + | |
| - | + | ||
| - | <file rust Ausgabe_nach_stderr.txt> | + | |
| - | use std:: | + | |
| - | + | ||
| - | fn main() -> io:: | + | |
| - | let stderr = io:: | + | |
| - | let mut handle = stderr.lock(); | + | |
| - | + | ||
| - | handle.write_all(b" | + | |
| - | + | ||
| - | Ok(()) | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | === stderr auf stdout umleiten === | + | |
| - | + | ||
| - | Wenn man "'' | + | |
| - | + | ||
| - | * [[https:// | + | |
| - | + | ||
| - | <file rust stderr2stdout.rs> | + | |
| - | fn main() { | + | |
| - | let ausgabe = std:: | + | |
| - | .arg(" | + | |
| - | .arg(" | + | |
| - | .output() | + | |
| - | .expect(" | + | |
| - | println!(" | + | |
| - | let s = String:: | + | |
| - | println!(" | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | <file rust ffprobe_Stream.rs> | + | |
| - | fn main() { | + | |
| - | let ausgabe = std:: | + | |
| - | .arg(" | + | |
| - | .arg(" | + | |
| - | .output() | + | |
| - | .expect(" | + | |
| - | println!(" | + | |
| - | let s = String:: | + | |
| - | for line in s.lines() { | + | |
| - | if line.starts_with(" | + | |
| - | println!(" | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Hier werden Daten verarbeitet, | + | |
| - | > rustc ffprobe_Stream.rs | + | |
| - | > ./ | + | |
| - | completed with exit code: 0 | + | |
| - | Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), | + | |
| - | + | ||
| - | + | ||
| - | ==== Datentypen ==== | + | |
| - | + | ||
| - | Ganze Zahlen mit Vorzeichen: | + | |
| - | i8, i16, i32, i64, i128, isize | + | |
| - | + | ||
| - | Ganze Zahlen ohne Vorzeichen: | + | |
| - | u8, u16, u32, u64, u128, usize | + | |
| - | + | ||
| - | Dezimalzahlen (Kommazahlen): | + | |
| - | f32, f64 | + | |
| - | + | ||
| - | Unicode-Zeichen: | + | |
| - | char | + | |
| - | + | ||
| - | Wahrheitswerte: | + | |
| - | + | ||
| - | Der promitive Typ " | + | |
| - | Dieser Wert wird dann benutzt, wenn kein anderer Wert zurückgegeben werden kann. | + | |
| - | In anderen Programmiersprachen würde man den Wert " | + | |
| - | + | ||
| - | isize = -9223372036854775808..9223372036854775807 | + | |
| - | usize = 0..18446744073709551615 | + | |
| - | + | ||
| - | Will man zwei Zahlen miteinander verarbeiten (vergleichen oder addieren), dann geht das nur, wenn beide Zahlen vom gleichen Typ sind. | + | |
| - | Deshalb bietet es sich an immer den größten Typ zu verwenden (außer man will speicherplatz sparen oder ein kleinwenig mehr Geschwindigkeit erzielen), | + | |
| - | und diesen dann im ganzen Code für alle Zahlen, die miteinander in Beziehung stehen, zu verwenden. | + | |
| - | So kann man sich Typumwandlungen sparen. | + | |
| - | + | ||
| - | Im Bereich der Zahlen, die im Alltag üblich sind, stehen dann diese Datentypen '' | + | |
| - | Allerdings sollte man die Unterschiede in ihrer Genauigkeit kennen. | + | |
| - | '' | + | |
| - | '' | + | |
| - | + | ||
| - | Beispielsweise gibt dieses Programm: | + | |
| - | fn main() { | + | |
| - | let a: u128 = 99999999999999999999999999999999999999; | + | |
| - | let b: i128 = -99999999999999999999999999999999999999; | + | |
| - | let c: f64 = 9999999999999999.9; | + | |
| - | let d: f64 = 999999999999999.9; | + | |
| - | let e: f64 = 99999999999999.9; | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | diese Ausgabe zurück: | + | |
| - | a = 99999999999999999999999999999999999999; | + | |
| - | b = -99999999999999999999999999999999999999; | + | |
| - | c = 10000000000000000; | + | |
| - | d = 999999999999999.9; | + | |
| - | e = 99999999999999.9 | + | |
| - | + | ||
| - | // | + | |
| - | 15 Stellen Genauigkeit sollte für die meisten Fälle im Alltag auch ausreichen, das reicht sogar für viele Wissenschaftliche Berechnungen aus.// | + | |
| - | + | ||
| - | + | ||
| - | ==== Arrays und Tupel ==== | + | |
| - | + | ||
| - | __Array__s benötigen einen speziellen Platzhalter ('' | + | |
| - | fn main() { | + | |
| - | let a = [5, 7, 12, 3241]; | + | |
| - | println!(" | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | fn main() { | + | |
| - | let a: [i32; 4] = [5, 7, 12, 3241]; | + | |
| - | println!(" | + | |
| - | println!(" | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | fn main() { | + | |
| - | let a = [5, 7, 12, 3241]; | + | |
| - | let [eins, zwei, drei, vier] = a; | + | |
| - | println!(" | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | __Tupel__ können, im Gegensatz zu Arrays, Elemente verschiedenen Datentyps enthalten: | + | |
| - | fn main() { | + | |
| - | let t = (5, 7, 12, 3241); | + | |
| - | println!(" | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | fn main() { | + | |
| - | let t = (5, false, " | + | |
| - | println!(" | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | fn main() { | + | |
| - | let t = (5, false, " | + | |
| - | let (eins, zwei, drei) = t; | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | + | ||
| - | ==== Slice ==== | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | Ein anderer Datentyp, der keinen Besitz hat, ist das '' | + | |
| - | + | ||
| - | <file rust test1.rs> | + | |
| - | fn main() { | + | |
| - | let vector = vec![1, 2, 3, 4, 5, 6, 7, 8]; | + | |
| - | let slice = & | + | |
| - | println!(" | + | |
| - | println!(" | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | <file rust test2.rs> | + | |
| - | fn string_slice(arg: | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | fn string(arg: String) { | + | |
| - | println!(" | + | |
| - | } | + | |
| - | + | ||
| - | fn main() { | + | |
| - | // | + | |
| - | string_slice(" | + | |
| - | + | ||
| - | string(" | + | |
| - | // | + | |
| - | + | ||
| - | string(String:: | + | |
| - | // | + | |
| - | + | ||
| - | string(" | + | |
| - | // | + | |
| - | + | ||
| - | string(" | + | |
| - | string_slice(" | + | |
| - | + | ||
| - | string(format!(" | + | |
| - | // | + | |
| - | + | ||
| - | // | + | |
| - | string_slice(& | + | |
| - | + | ||
| - | // | + | |
| - | string_slice(" | + | |
| - | + | ||
| - | string(" | + | |
| - | // | + | |
| - | + | ||
| - | string(" | + | |
| - | // | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | ==== Dateien anlegen, lesen, schreiben, überschreiben und löschen ==== | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | Rusts Kernfeature ist das sogenannte Ownership. Es beschreibt die Idee, dass jeder Datentyp gleichzeitig eine Resource darstellt. Rust löst das darüber, dass es jedem Stück Daten einen sogenannten Owner zuweist. Erstelle ich mit '' | + | |
| - | Daten in Rust haben also einen modellierten Lebenszyklus. Im Gegensatz zu vielen anderen Sprachen ist dieses Konzept keine Konvention, sondern einer der Grundpfeiler des Typsystems. Deswegen begegnet es einem auch sofort und muss gelernt werden - es führt kein Weg daran vorbei. | + | |
| - | + | ||
| - | <file rust test_golem_1.rs> | + | |
| - | use std:: | + | |
| - | use std:: | + | |
| - | use std::io; | + | |
| - | + | ||
| - | fn main() -> Result< | + | |
| - | let open_file = File:: | + | |
| - | match open_file { | + | |
| - | Ok(mut file) => { | + | |
| - | file.write_all(b" | + | |
| - | // hier wird die Datei aufgegeben und damit geschlossen | + | |
| - | } | + | |
| - | Err(e) => { | + | |
| - | eprintln!(" | + | |
| - | Err(e) | + | |
| - | } | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | ==== vector + for ==== | + | |
| - | + | ||
| - | <file rust for-Schleife.rs> | + | |
| - | use std::env; | + | |
| - | //let mut aaa: Vec< | + | |
| - | + | ||
| - | fn main() { | + | |
| - | let vector: Vec< | + | |
| - | println!(" | + | |
| - | + | ||
| - | println!(" | + | |
| - | + | ||
| - | let l = vector.len(); | + | |
| - | println!(" | + | |
| - | + | ||
| - | println!(" | + | |
| - | + | ||
| - | for i in 0..l { | + | |
| - | println!(" | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | ==== externe Programme aufrufen ==== | + | |
| - | + | ||
| - | * [[https:// | + | |
| - | * [[https:// | + | |
| - | + | ||
| - | <file rust command_1.rs> | + | |
| - | fn main() { | + | |
| - | std:: | + | |
| - | .arg(" | + | |
| - | .arg(" | + | |
| - | .arg(" | + | |
| - | .status() | + | |
| - | .expect(" | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | <file rust command_2.rs> | + | |
| - | fn main() { | + | |
| - | use std:: | + | |
| - | + | ||
| - | Command:: | + | |
| - | .arg(" | + | |
| - | .arg(" | + | |
| - | .arg(" | + | |
| - | .spawn() | + | |
| - | .expect(" | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | <file rust command_3.rs> | + | |
| - | fn main() { | + | |
| - | use std:: | + | |
| - | + | ||
| - | let mut child = Command:: | + | |
| - | .arg(" | + | |
| - | .spawn() | + | |
| - | .expect(" | + | |
| - | + | ||
| - | let ecode = child.wait() | + | |
| - | .expect(" | + | |
| - | + | ||
| - | assert!(ecode.success()); | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | <file rust command_4.rs> | + | |
| - | fn main() { | + | |
| - | use std:: | + | |
| - | + | ||
| - | let mut list_dir = Command:: | + | |
| - | + | ||
| - | // Execute `ls` in the current directory of the program. | + | |
| - | list_dir.status().expect(" | + | |
| - | + | ||
| - | println!(); | + | |
| - | + | ||
| - | // Change `ls` to execute in the root directory. | + | |
| - | list_dir.current_dir("/" | + | |
| - | + | ||
| - | // And then execute `ls` again but in the root directory. | + | |
| - | list_dir.status().expect(" | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | ==== aus den FAQs ==== | + | |
| - | + | ||
| - | * [[https:// | + | |
| - | * Ein wichtiges Detail ist, dass der Rückgabetyp einer Funktion, welche mit einem Semikolon endet, () ist. Dies deutet an, dass kein Wert zurückgegeben wird. Implizite Rückgaben funktionieren nur ohne abschließendes Semikolon, da sonst der Wert des Ausdrucks unterdrückt wird. | + | |
| - | + | ||
| - | + | ||
| - | ===== mein Beispiel-Kode | + | |
| Zeile 696: | Zeile 303: | ||
| [[https:// | [[https:// | ||
| + | |||
| + | |||
| + | ===== was ich noch mit Rust lernen möchte/ | ||
| + | |||
| + | FIXME | ||
| + | |||
| + | * Dateien-/ | ||
| + | * öffnen | ||
| + | * anlegen | ||
| + | * überschreiben | ||
| + | * löschen | ||
| + | * Verzweigungen | ||
| + | * if-then-else | ||
| + | * Schleifen | ||
| + | * while | ||
| + | * for (Zählschleife) | ||
| + | * Argumente/ | ||
| + | * arbeiten mit Arrays | ||
| + | * eigene Funktionen erstellen | ||
/home/http/wiki/data/attic/beispiel-programme_in_rust.1634572277.txt · Zuletzt geändert: von manfred
