From b876f1b6a944ff5f9fa50369d20354f8a43ff713 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 14:17:44 +0200 Subject: [PATCH 01/57] =?UTF-8?q?Links=20=C3=BCberarbeiten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/title-page.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/title-page.md b/src/title-page.md index c665752c..faa28739 100644 --- a/src/title-page.md +++ b/src/title-page.md @@ -8,17 +8,21 @@ Diese Version des Textes geht davon aus, dass du Rust 1.65 (veröffentlicht am 1][install1] zum Installieren und Aktualisieren von Rust. Die HTML-Version ist online verfügbar unter -[https://doc.rust-lang.org/stable/book/](https://doc.rust-lang.org/stable/book/) +[https://doc.rust-lang.org/stable/book/][rustbook-en] (englisches Original) und unter -[https://rust-lang-de.github.io/rustbook-de/](https://rust-lang-de.github.io/rustbook-de/) -(deutsche Übersetzung) und offline mit Rust-Installationen, die mit `rustup` +[https://rust-lang-de.github.io/rustbook-de/][rustbook-de] +(deutsche Übersetzung) sowie offline in Rust-Installationen, die mit `rustup` erfolgt sind; führe `rustup docs --book` aus um es zu öffnen. Es sind weitere [Gemeinschaftsübersetzungen][translations] verfügbar. -Der englische Text ist auch als [Taschenbuch und E-Book bei No Starch -Press][nsprust] erhältlich. +Der englische Text ist als [Taschenbuch und E-Book bei No Starch +Press][nsprust] erhältlich, den deutschen Text gibt es ebenfalls als +[Taschenbuch und E-Book][rust-lernen]. [install1]: ch01-01-installation.html [nsprust]: https://nostarch.com/rust-programming-language-2nd-edition +[rustbook-de]: https://rust-lang-de.github.io/rustbook-de/ +[rustbook-en]: https://doc.rust-lang.org/stable/book/ +[rust-lernen]: https://rust-lernen.de/ [translations]: appendix-06-translation.html From 103adc4f4cb8beba624a5de218de0cd65b1520f9 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 14:19:00 +0200 Subject: [PATCH 02/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/title-page.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/title-page.md b/src/title-page.md index faa28739..4624d404 100644 --- a/src/title-page.md +++ b/src/title-page.md @@ -3,8 +3,8 @@ *von Steve Klabnik und Carol Nichols, unter Mitarbeit der Rust-Gemeinschaft;* *übersetzt ins Deutsche durch die Rust-Gemeinschaft* -Diese Version des Textes geht davon aus, dass du Rust 1.65 (veröffentlicht am -2022-11-03) oder später verwendest. Siehe [Abschnitt „Installation“ in Kapitel +Diese Version des Textes geht davon aus, dass du Rust 1.67.1 (veröffentlicht am +2023-02-09) oder später verwendest. Siehe [Abschnitt „Installation“ in Kapitel 1][install1] zum Installieren und Aktualisieren von Rust. Die HTML-Version ist online verfügbar unter From 4689a6afe37a8fa869a280171064afbaa32fd80d Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 14:19:12 +0200 Subject: [PATCH 03/57] =?UTF-8?q?Links=20=C3=BCberarbeiten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch00-00-introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch00-00-introduction.md b/src/ch00-00-introduction.md index 25e62fb4..8f616b25 100644 --- a/src/ch00-00-introduction.md +++ b/src/ch00-00-introduction.md @@ -203,4 +203,4 @@ Codeversion, wenn er sich nicht kompilieren lässt. Die Quelldateien, aus denen dieses Buch generiert wird, findest du unter [GitHub][book-de]. -[book-de]: https://github.com/rust-lang-de/rustbook-de/tree/master/src +[book-de]: https://github.com/rust-lang-de/rustbook-de/ From f0f669d3b65fe6754ddf28613e90d39ed45c9f6e Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 18:10:44 +0200 Subject: [PATCH 04/57] Begriffe Konsole und Terminal vereinheitlichen --- src/ch01-01-installation.md | 21 ++++++++++----------- src/ch01-02-hello-world.md | 6 +++--- src/ch05-02-example-structs.md | 6 +++--- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/ch01-01-installation.md b/src/ch01-01-installation.md index 7d294a0c..c7f08a8e 100644 --- a/src/ch01-01-installation.md +++ b/src/ch01-01-installation.md @@ -10,19 +10,18 @@ benötigen. > nach anderen Möglichkeiten. Die folgenden Schritte installieren die neueste stabile Version des -Rust-Compilers. Rust garantiert Stabilität und stellt somit sicher, -dass alle kompilierbaren Beispiele in diesem Buch auch mit neueren -Rust-Versionen kompilierbar bleiben werden. Die Konsolenausgabe -der Beispiele kann sich zwischen Versionen leicht unterscheiden, -weil Rust oft Fehlermeldungen und Warnungen verbessert. -Anders ausgedrückt, jede neuere stabile Version von Rust, die du -mithilfe dieser Schritte installierst, sollte wie erwartet mit dem -Inhalt dieses Buches funktionieren. +Rust-Compilers. Rust garantiert Stabilität und stellt somit sicher, dass alle +kompilierbaren Beispiele in diesem Buch auch mit neueren Rust-Versionen +kompilierbar bleiben werden. Die Ausgabe der Beispiele kann sich zwischen +Versionen leicht unterscheiden, weil Rust oft Fehlermeldungen und Warnungen +verbessert. Anders ausgedrückt, jede neuere stabile Version von Rust, die du +mithilfe dieser Schritte installierst, sollte wie erwartet mit dem Inhalt +dieses Buchs funktionieren. > ### Kommandozeilen-Schreibweise > -> In diesem Kapitel und im ganzen Buch werden wir einige Befehle auf der -> Konsole zeigen. Alle Zeilen, die du in die Konsole eingeben sollst, +> In diesem Kapitel und im ganzen Buch werden wir einige Befehle auf dem +> Terminal zeigen. Alle Zeilen, die du in das Terminal eingeben sollst, > beginnen mit `$`. Du brauchst das `$`-Zeichen nicht einzugeben; > es weist nur auf den Beginn jedes Befehls hin. Zeilen, die nicht mit > `$` beginnen, zeigen normalerweise die Ausgabe eines vorherigen Befehls. @@ -31,7 +30,7 @@ Inhalt dieses Buches funktionieren. ### Die Installation von `rustup` in Linux und macOS -Falls du Linux oder macOS verwendest, öffne ein Konsolenfenster und gib den +Falls du Linux oder macOS verwendest, öffne ein Terminalfenster und gib den folgenden Befehl ein: ```console diff --git a/src/ch01-02-hello-world.md b/src/ch01-02-hello-world.md index 1c2c1b64..6f366818 100644 --- a/src/ch01-02-hello-world.md +++ b/src/ch01-02-hello-world.md @@ -65,7 +65,7 @@ fn main() { Codeblock 1-1: Ein Programm, das `Hallo Welt!` ausgibt -Speichere die Datei und gehe zurück zu deinem Konsolenfenster. Gib unter Linux +Speichere die Datei und gehe zurück zu deinem Terminalfenster. Gib unter Linux oder MacOS die folgenden Befehle ein, um die Datei zu kompilieren und auszuführen: ```console @@ -166,7 +166,7 @@ Wenn du einen C- oder C++-Hintergrund hast, wirst du feststellen, dass dies eine ausführbare Binärdatei aus. Unter Linux, MacOS und PowerShell unter Windows kannst du die ausführbare Datei -sehen, indem du den Befehl `ls` in deiner Konsole eingibst: +sehen, indem du den Befehl `ls` in deinem Terminal eingibst: ```console $ ls @@ -195,7 +195,7 @@ $ ./main # oder .\main.exe unter Windows ``` Wenn *main.rs* dein „Hallo Welt!“-Programm wäre, würde diese Zeile „Hallo -Welt!“ in deiner Konsole ausgeben. +Welt!“ in deinem Terminal ausgeben. Wenn du mit einer dynamischen Sprache wie Ruby, Python oder JavaScript besser vertraut bist, bist du es möglicherweise nicht gewohnt, ein Programm in diff --git a/src/ch05-02-example-structs.md b/src/ch05-02-example-structs.md index aa6dab8e..15b90082 100644 --- a/src/ch05-02-example-structs.md +++ b/src/ch05-02-example-structs.md @@ -305,9 +305,9 @@ Zeilennummer, in der der `dbg!`-Makroaufruf in deinem Code vorkommt, zusammen mit dem resultierenden Wert des Ausdrucks ausgibt und die Eigentümerschaft am Wert zurückgibt. -> Hinweis: Der Aufruf des Makros `dbg!` schreibt in den -> Standard-Fehler-Konsolenstrom (`stderr`), im Gegensatz zu `println!`, das in -> den Standard-Ausgabe-Konsolenstrom (`stdout`) schreibt. Wir werden mehr über +> Hinweis: Der Aufruf des Makros `dbg!` schreibt in die +> Standardfehlerausgabe (`stderr`), im Gegensatz zu `println!`, das in +> die Standardausgabe (`stdout`) schreibt. Wir werden mehr über > `stderr` und `stdout` im Abschnitt [„Fehlermeldungen in die > Standardfehlerausgabe anstatt der Standardausgabe schreiben“ in Kapitel > 12][err] erfahren. From f329675dbd664fb7b71910b33d34722fd63c6e2c Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 18:58:45 +0200 Subject: [PATCH 05/57] Begriffe Kommandozeile und Terminal vereinheitlichen --- src/ch01-01-installation.md | 9 ++++----- src/ch01-02-hello-world.md | 8 ++++---- ...-paths-for-referring-to-an-item-in-the-module-tree.md | 2 +- src/ch12-00-an-io-project.md | 4 ++-- src/ch12-04-testing-the-librarys-functionality.md | 4 ++-- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/ch01-01-installation.md b/src/ch01-01-installation.md index c7f08a8e..5704e0e6 100644 --- a/src/ch01-01-installation.md +++ b/src/ch01-01-installation.md @@ -85,8 +85,8 @@ werden wir diese erläutern. ### Fehlersuche -Um zu überprüfen, ob du Rust korrekt installiert hast, öffne eine -Kommandozeile und gib folgende Zeile ein: +Um zu überprüfen, ob du Rust korrekt installiert hast, öffne ein +Terminal und gib folgende Zeile ein: ```console $ rustc --version @@ -128,9 +128,8 @@ Rust-Entwicklern in Kontakt treten kannst, erfährst du auf der ### Aktualisieren und Deinstallieren -Nachdem du Rust mithilfe von `rustup` installiert hast, ist es einfach, -auf die neueste Version zu aktualisieren. Führe folgenden Befehl auf der -Kommandozeile aus: +Nachdem du Rust mithilfe von `rustup` installiert hast, ist es einfach, auf die +neueste Version zu aktualisieren. Führe folgenden Befehl im Terminal aus: ```console $ rustup update diff --git a/src/ch01-02-hello-world.md b/src/ch01-02-hello-world.md index 6f366818..569b7dbe 100644 --- a/src/ch01-02-hello-world.md +++ b/src/ch01-02-hello-world.md @@ -22,7 +22,7 @@ erstellen. Es ist Rust egal, wo dein Code lebt, aber für die Übungen und Projekte in diesem Buch schlagen wir vor, ein Verzeichnis *projects* in deinem Hauptverzeichnis anzulegen und all deine Projekte dort abzulegen. -Öffne eine Kommandozeile und gib die folgenden Befehle ein, um ein Verzeichnis +Öffne ein Terminal und gib die folgenden Befehle ein, um ein Verzeichnis *projects* und ein Verzeichnis für das Projekt „Hallo Welt!“ innerhalb des Verzeichnisses *projects* zu erstellen. @@ -82,9 +82,9 @@ Unter Windows gib den Befehl `.\main.exe` anstelle von `./main` ein: Hallo Welt! ``` -Unabhängig von deinem Betriebssystem sollte die Zeichenfolge `Hallo Welt!` auf -der Kommandozeile ausgegeben werden. Wenn du diese Ausgabe nicht siehst, lies -im Abschnitt [„Fehlersuche“][troubleshooting] des Installationsabschnitts nach, +Unabhängig von deinem Betriebssystem sollte die Zeichenfolge `Hallo Welt!` im +Terminal ausgegeben werden. Wenn du diese Ausgabe nicht siehst, lies im +Abschnitt [„Fehlersuche“][troubleshooting] des Installationsabschnitts nach, wie du Hilfe erhalten kannst. Wenn `Hallo Welt!` ausgegeben wurde, herzlichen Glückwunsch! Du hast offiziell diff --git a/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md b/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md index 7f09357b..3eebd340 100644 --- a/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md +++ b/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md @@ -62,7 +62,7 @@ erreichen. Du kannst dir ein Dateisystem mit der gleichen Struktur vorstellen: Wir würden den Pfad `/front_of_house/hosting/add_to_waitlist` angeben, um das Programm `add_to_waitlist` auszuführen; das Verwenden des Namens `crate`, um von der Kistenwurzel aus zu beginnen, ist analog zu `/`, um vom -Dateisystem-Wurzelverzeichnis in deiner Eingabeaufforderung aus zu beginnen. +Dateisystem-Wurzelverzeichnis in deinem Terminal aus zu beginnen. Beim zweiten Aufruf von `add_to_waitlist` in `eat_at_restaurant` verwenden wir einen relativen Pfad. Der Pfad beginnt mit `front_of_house`, dem Namen des diff --git a/src/ch12-00-an-io-project.md b/src/ch12-00-an-io-project.md index 5f41e373..482fda65 100644 --- a/src/ch12-00-an-io-project.md +++ b/src/ch12-00-an-io-project.md @@ -3,8 +3,8 @@ Dieses Kapitel ist eine Zusammenfassung der vielen Fähigkeiten, die du bisher gelernt hast, und eine Erkundung einiger weiterer Standard-Bibliotheks-Funktionalitäten. Wir werden ein Kommandozeilenwerkzeug -erstellen, das mit Datei- und Kommandozeilen-Ein- und -Ausgabe interagiert, um -einige der Rust-Konzepte zu üben, die du bereits gelernt hast. +erstellen, das mit der Datei- und der Terminal-Ein- und -Ausgabe interagiert, +um einige der Rust-Konzepte zu üben, die du bereits gelernt hast. Rusts Geschwindigkeit, Sicherheit, Ausgabe in eine einzelne Binärdatei und plattformübergreifende Unterstützung machen es zu einer idealen Sprache zum diff --git a/src/ch12-04-testing-the-librarys-functionality.md b/src/ch12-04-testing-the-librarys-functionality.md index 3492c7a0..7c545806 100644 --- a/src/ch12-04-testing-the-librarys-functionality.md +++ b/src/ch12-04-testing-the-librarys-functionality.md @@ -4,8 +4,8 @@ Jetzt, da wir die Logik nach *src/lib.rs* extrahiert haben und die Argumentkollektion und Fehlerbehandlung in *src/main.rs* belassen haben, ist es viel einfacher, Tests für die Kernfunktionalität unseres Codes zu schreiben. Wir können Funktionen direkt mit verschiedenen Argumenten aufrufen und -Rückgabewerte überprüfen, ohne unsere Binärdatei von der Kommandozeile aus -aufrufen zu müssen. +Rückgabewerte überprüfen, ohne unsere Binärdatei Terminal aus aufrufen zu +müssen. In diesem Abschnitt fügen wir dem `minigrep`-Programm die Suchlogik hinzu, indem wir die Methode der testgetriebenen Entwicklung (TDD) verwenden. Diese From 435d79b01e79abdb441811cb26278b32f1c39ba8 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:06:19 +0200 Subject: [PATCH 06/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch01-02-hello-world.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ch01-02-hello-world.md b/src/ch01-02-hello-world.md index 569b7dbe..c84c71f8 100644 --- a/src/ch01-02-hello-world.md +++ b/src/ch01-02-hello-world.md @@ -65,8 +65,9 @@ fn main() { Codeblock 1-1: Ein Programm, das `Hallo Welt!` ausgibt -Speichere die Datei und gehe zurück zu deinem Terminalfenster. Gib unter Linux -oder MacOS die folgenden Befehle ein, um die Datei zu kompilieren und auszuführen: +Speichere die Datei und gehe zurück zu deinem Terminalfenster im Verzeichnis +*~/projects/hello_world*. Gib unter Linux oder MacOS die folgenden Befehle ein, +um die Datei zu kompilieren und auszuführen: ```console $ rustc main.rs From da5ab72d45119e1c8ccfbc41e14c73f6b6bfced2 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:25:45 +0200 Subject: [PATCH 07/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch02-00-guessing-game-tutorial.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/ch02-00-guessing-game-tutorial.md b/src/ch02-00-guessing-game-tutorial.md index 3370a2a0..185227d6 100644 --- a/src/ch02-00-guessing-game-tutorial.md +++ b/src/ch02-00-guessing-game-tutorial.md @@ -823,19 +823,26 @@ versuchen: ```console $ cargo build - Compiling libc v0.2.51 - Compiling rand_core v0.4.0 - Compiling rand_core v0.3.1 - Compiling rand v0.5.6 + Compiling libc v0.2.86 + Compiling getrandom v0.2.2 + Compiling cfg-if v1.0.0 + Compiling ppv-lite86 v0.2.10 + Compiling rand_core v0.6.2 + Compiling rand_chacha v0.3.0 + Compiling rand v0.8.5 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) error[E0308]: mismatched types --> src/main.rs:22:21 | 22 | match guess.cmp(&secret_number) { - | ^^^^^^^^^^^^^^ expected struct `String`, found integer + | --- ^^^^^^^^^^^^^^ expected struct `String`, found integer + | | + | arguments to this function are incorrect | = note: expected reference `&String` found reference `&{integer}` +note: associated function defined here + --> /rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/core/src/cmp.rs:783:8 For more information about this error, try `rustc --explain E0308`. error: could not compile `guessing_game` due to previous error From 4a81d30d48dcb1f5ca5b59ff5142a4908bba6d0b Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:31:18 +0200 Subject: [PATCH 08/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch03-02-data-types.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ch03-02-data-types.md b/src/ch03-02-data-types.md index 6633b183..c9b9a1ab 100644 --- a/src/ch03-02-data-types.md +++ b/src/ch03-02-data-types.md @@ -29,7 +29,12 @@ error[E0282]: type annotations needed --> src/main.rs:2:9 | 2 | let guess = "42".parse().expect("Keine Zahl!"); - | ^^^^^ consider giving `guess` a type + | ^^^^^ + | +help: consider giving `guess` an explicit type + | +2 | let guess: _ = "42".parse().expect("Keine Zahl!"); + | +++ For more information about this error, try `rustc --explain E0282`. error: could not compile `no_type_annotations` due to previous error @@ -194,7 +199,7 @@ fn main() { // Division let quotient = 56.7 / 32.2; - let floored = 2 / 3; // Ergibt 0 + let truncated = -5 / 3; // Ergibt -1 // Restberechnung let remainder = 43 % 5; From d6356705db201eed4c0227a1a674de4c729c97a2 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:35:25 +0200 Subject: [PATCH 09/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch03-03-how-functions-work.md | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/ch03-03-how-functions-work.md b/src/ch03-03-how-functions-work.md index 21d0c67f..a0b91111 100644 --- a/src/ch03-03-how-functions-work.md +++ b/src/ch03-03-how-functions-work.md @@ -188,15 +188,12 @@ Wenn du dieses Programm ausführst, wirst du in etwa folgenden Fehler erhalten: ```console $ cargo run - Compiling playground v0.0.1 (/playground) -error[E0658]: `let` expressions in this position are experimental + Compiling functions v0.1.0 (file:///projects/functions) +error: expected expression, found `let` statement --> src/main.rs:2:14 | 2 | let x = (let y = 6); - | ^^^^^^^^^ - | - = note: see issue #53667 for more information - = help: you can write `matches!(, )` instead of `let = ` + | ^^^ error: expected expression, found statement (`let`) --> src/main.rs:2:14 @@ -206,20 +203,30 @@ error: expected expression, found statement (`let`) | = note: variable declaration using `let` is a statement +error[E0658]: `let` expressions in this position are unstable + --> src/main.rs:2:14 + | +2 | let x = (let y = 6); + | ^^^^^^^^^ + | + = note: see issue #53667 for more information + warning: unnecessary parentheses around assigned value --> src/main.rs:2:13 | 2 | let x = (let y = 6); - | ^^^^^^^^^^^ help: remove these parentheses + | ^ ^ | = note: `#[warn(unused_parens)]` on by default - -error: aborting due to 2 previous errors; 1 warning emitted +help: remove these parentheses + | +2 - let x = (let y = 6); +2 + let x = let y = 6; + | For more information about this error, try `rustc --explain E0658`. -error: could not compile `playground` - -To learn more, run the command again with --verbose. +warning: `functions` (bin "functions") generated 1 warning +error: could not compile `functions` due to 3 previous errors; 1 warning emitted ``` Die Anweisung `let y = 6` gibt keinen Wert zurück, also gibt es für `x` nichts, From 6bc6300f6487800418570be5c06a1caae583f353 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:51:54 +0200 Subject: [PATCH 10/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch04-01-what-is-ownership.md | 33 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/ch04-01-what-is-ownership.md b/src/ch04-01-what-is-ownership.md index ec0e4d61..95554dce 100644 --- a/src/ch04-01-what-is-ownership.md +++ b/src/ch04-01-what-is-ownership.md @@ -1,18 +1,16 @@ ## Was ist Eigentümerschaft (ownership)? *Eigentümerschaft* ist eine Reihe von Regeln, die bestimmen, wie ein -Rust-Programm den Speicher verwaltet. - -Alle Programme müssen den Arbeitsspeicher eines Rechners verwalten, während sie -ausgeführt werden. Einige Sprachen verfügen über eine automatische -Speicherbereinigung, die während der Programmausführung ständig nach nicht mehr -genutztem Speicher sucht. Bei anderen Sprachen muss der Programmierer selbst -den Speicher explizit reservieren und freigeben. Rust verwendet einen dritten -Ansatz: Der Speicher wird durch ein System aus Eigentümerschaft und einer Reihe -von Regeln verwaltet, die der Compiler überprüft. Wenn eine der Regeln verletzt -wird, lässt sich das Programm nicht kompilieren. Keine der -Eigentümerschaftsfunktionalitäten verlangsamt dein Programm, während es -läuft. +Rust-Programm den Speicher verwaltet. Alle Programme müssen den Arbeitsspeicher +eines Rechners verwalten, während sie ausgeführt werden. Einige Sprachen +verfügen über eine automatische Speicherbereinigung, die während der +Programmausführung ständig nach nicht mehr genutztem Speicher sucht. Bei +anderen Sprachen muss der Programmierer selbst den Speicher explizit +reservieren und freigeben. Rust verwendet einen dritten Ansatz: Der Speicher +wird durch ein System aus Eigentümerschaft und einer Reihe von Regeln +verwaltet, die der Compiler überprüft. Wenn eine der Regeln verletzt wird, +lässt sich das Programm nicht kompilieren. Keine der +Eigentümerschaftsfunktionalitäten verlangsamt dein Programm, während es läuft. Da die Eigentümerschaft für viele Programmierer ein neues Konzept ist, braucht es etwas Zeit, sich daran zu gewöhnen. Die gute Nachricht ist, je mehr @@ -112,8 +110,7 @@ Lass uns zunächst einen Blick auf die Eigentumsregeln (ownership rules) werfen. Behalte diese Regeln im Hinterkopf, während wir veranschaulichende Beispiele durcharbeiten: -* Jeder Wert in Rust hat eine Variable, die als sein *Eigentümer* bezeichnet - wird. +* Jeder Wert in Rust hat einen *Eigentümer* (owner). * Es kann immer nur einen Eigentümer zur gleichen Zeit geben. * Wenn der Eigentümer den Gültigkeitsbereich verlässt, wird der Wert aufgeräumt. @@ -407,9 +404,15 @@ error[E0382]: borrow of moved value: `s1` | -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait 3 | let s2 = s1; | -- value moved here -4 | +4 | 5 | println!("{} Welt!", s1); | ^^ value borrowed here after move + | + = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) +help: consider cloning the value if the performance cost is acceptable + | +3 | let s2 = s1.clone(); + | ++++++++ For more information about this error, try `rustc --explain E0382`. error: could not compile `ownership` due to previous error From 3f81c4f81a2f94d650d485a5624d95dc085791fc Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:58:05 +0200 Subject: [PATCH 11/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch04-02-references-and-borrowing.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ch04-02-references-and-borrowing.md b/src/ch04-02-references-and-borrowing.md index c2b92393..2c3fec3e 100644 --- a/src/ch04-02-references-and-borrowing.md +++ b/src/ch04-02-references-and-borrowing.md @@ -133,7 +133,7 @@ error[E0596]: cannot borrow `*some_string` as mutable, as it is behind a `&` ref 7 | fn change(some_string: &String) { | ------- help: consider changing this to be a mutable reference: `&mut String` 8 | some_string.push_str(" Welt"); - | ^^^^^^^^^^^ `some_string` is a `&` reference, so the data it refers to cannot be borrowed as mutable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `some_string` is a `&` reference, so the data it refers to cannot be borrowed as mutable For more information about this error, try `rustc --explain E0596`. error: could not compile `ownership` due to previous error @@ -361,7 +361,7 @@ error[E0106]: missing lifetime specifier help: consider using the `'static` lifetime | 5 | fn dangle() -> &'static String { - | ~~~~~~~~ + | +++++++ For more information about this error, try `rustc --explain E0106`. error: could not compile `ownership` due to previous error From ed431938e0a90ce36ce2ecf03685f3b0f13c89ff Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 9 Jul 2023 21:40:57 +0200 Subject: [PATCH 12/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch05-01-defining-structs.md | 44 ++++++++++++++++----------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/ch05-01-defining-structs.md b/src/ch05-01-defining-structs.md index e67a3b2e..7b696100 100644 --- a/src/ch05-01-defining-structs.md +++ b/src/ch05-01-defining-structs.md @@ -51,9 +51,9 @@ Codeblock 5-2 zu sehen ist. # fn main() { let user1 = User { - email: String::from("jemand@example.com"), - username: String::from("benutzername123"), active: true, + username: String::from("benutzername123"), + email: String::from("jemand@example.com"), sign_in_count: 1, }; } @@ -81,9 +81,9 @@ einem bestimmten Feld zuweisen. Codeblock 5-3 gezeigt, wie der Wert im Feld # fn main() { let mut user1 = User { - email: String::from("jemand@example.com"), - username: String::from("benutzername123"), active: true, + username: String::from("benutzername123"), + email: String::from("jemand@example.com"), sign_in_count: 1, }; @@ -114,9 +114,9 @@ den Wert `true` und das Feld `sign_in_count` den Wert `1`. # fn build_user(email: String, username: String) -> User { User { - email: email, - username: username, active: true, + username: username, + email: email, sign_in_count: 1, } } @@ -158,9 +158,9 @@ wiederholen, siehe Codeblock 5-5. # fn build_user(email: String, username: String) -> User { User { - email, - username, active: true, + username, + email, sign_in_count: 1, } } @@ -389,38 +389,36 @@ für jeden Typ implementiert, auch für unit-ähnliche Strukturen. > > ```console > $ cargo run -> Compiling playground v0.0.1 (/playground) +> Compiling structs v0.1.0 (file:///projects/structs) > error[E0106]: missing lifetime specifier -> --> src/main.rs:2:15 +> --> src/main.rs:3:15 > | -> 2 | username: &str, +> 3 | username: &str, > | ^ expected named lifetime parameter > | > help: consider introducing a named lifetime parameter > | -> 1 | struct User<'a> { -> 2 | username: &'a str, +> 1 ~ struct User<'a> { +> 2 | active: bool, +> 3 ~ username: &'a str, > | > > error[E0106]: missing lifetime specifier -> --> src/main.rs:3:12 +> --> src/main.rs:4:12 > | -> 3 | email: &str, +> 4 | email: &str, > | ^ expected named lifetime parameter > | > help: consider introducing a named lifetime parameter > | -> 1 | struct User<'a> { -> 2 | username: &str, -> 3 | email: &'a str, +> 1 ~ struct User<'a> { +> 2 | active: bool, +> 3 | username: &str, +> 4 ~ email: &'a str, > | > -> error: aborting due to 2 previous errors -> > For more information about this error, try `rustc --explain E0106`. -> error: could not compile `playground` -> -> To learn more, run the command again with --verbose. +> error: could not compile `structs` due to 2 previous errors > ``` > > In Kapitel 10 werden wir klären, wie man diese Fehler behebt und Referenzen From d4ae95ba53cd640d0b444a8f333c141cc9109af4 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:25:44 +0200 Subject: [PATCH 13/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch05-02-example-structs.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ch05-02-example-structs.md b/src/ch05-02-example-structs.md index 15b90082..316175f1 100644 --- a/src/ch05-02-example-structs.md +++ b/src/ch05-02-example-structs.md @@ -7,10 +7,8 @@ einsetzen. Legen wir mit Cargo ein neues Binärprojekt namens *rectangles* an, das die Breite und Höhe eines in Pixeln angegebenen Rechtecks nimmt und die Fläche des -Rechtecks berechnet. - -Codeblock 5-8 zeigt ein kurzes Programm, das genau das in *src/main.rs* unseres -Projekts macht. +Rechtecks berechnet. Codeblock 5-8 zeigt ein kurzes Programm, das genau das in +*src/main.rs* unseres Projekts macht. Dateiname: src/main.rs From 18f772691bba195cd898bdf36fa4e381f8185c52 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:26:29 +0200 Subject: [PATCH 14/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch06-01-defining-an-enum.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ch06-01-defining-an-enum.md b/src/ch06-01-defining-an-enum.md index 8887fcef..a19ea6fa 100644 --- a/src/ch06-01-defining-an-enum.md +++ b/src/ch06-01-defining-an-enum.md @@ -426,6 +426,11 @@ error[E0277]: cannot add `Option` to `i8` | ^ no implementation for `i8 + Option` | = help: the trait `Add>` is not implemented for `i8` + = help: the following other types implement trait `Add`: + <&'a i8 as Add> + <&i8 as Add<&i8>> + > + For more information about this error, try `rustc --explain E0277`. error: could not compile `enums` due to previous error From 9bc4b0ffc15562dd6f8bb07f50f2e8ebd583ccf0 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:36:12 +0200 Subject: [PATCH 15/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch06-02-match.md | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/ch06-02-match.md b/src/ch06-02-match.md index 1300d480..5c92a41c 100644 --- a/src/ch06-02-match.md +++ b/src/ch06-02-match.md @@ -263,10 +263,10 @@ fn plus_one(x: Option) -> Option { Some(i) => Some(i + 1), } } - -let five = Some(5); -let six = plus_one(five); -let none = plus_one(None); +# +# let five = Some(5); +# let six = plus_one(five); +# let none = plus_one(None); ``` Wir haben den Fall `None` nicht behandelt, daher wird dieser Code einen Fehler @@ -278,13 +278,22 @@ diese Fehlermeldung bekommen: $ cargo run Compiling enums v0.1.0 (file:///projects/enums) error[E0004]: non-exhaustive patterns: `None` not covered - --> src/main.rs:3:15 - | -3 | match x { - | ^ pattern `None` not covered - | - = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms - = note: the matched value is of type `Option` + --> src/main.rs:3:15 + | +3 | match x { + | ^ pattern `None` not covered + | +note: `Option` defined here + --> /rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/core/src/option.rs:518:1 + | + = note: +/rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/core/src/option.rs:522:5: not covered + = note: the matched value is of type `Option` +help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown + | +4 ~ Some(i) => Some(i + 1), +5 ~ None => todo!(), + | For more information about this error, try `rustc --explain E0004`. error: could not compile `enums` due to previous error From d1970a15bd0837e649a298999531da8029fa5640 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:41:17 +0200 Subject: [PATCH 16/57] =?UTF-8?q?Bedeutung=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch07-02-defining-modules-to-control-scope-and-privacy.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ch07-02-defining-modules-to-control-scope-and-privacy.md b/src/ch07-02-defining-modules-to-control-scope-and-privacy.md index 8ca88947..b49c58f7 100644 --- a/src/ch07-02-defining-modules-to-control-scope-and-privacy.md +++ b/src/ch07-02-defining-modules-to-control-scope-and-privacy.md @@ -42,8 +42,8 @@ sich daran zu erinnern, wie Module funktionieren. - **Pfade zum Code in Modulen**: Sobald ein Modul Teil deiner Kiste ist, kannst du auf den Code in diesem Modul von jedem anderen Ort in derselben Kiste aus referenzieren, solange die Datenschutzregeln dies zulassen, indem du den Pfad - zum Code verwendest. Zum Beispiel würde ein Typ `Asparagus` im - Gartengemüse-Modul unter `crate::garden::vegetables::Asparagus` zu finden + zum Code verwendest. Zum Beispiel würde ein Typ `Asparagus` (engl. Spargel) + im Gartengemüse-Modul unter `crate::garden::vegetables::Asparagus` zu finden sein. - **Privat vs. öffentlich**: Der Code innerhalb eines Moduls ist standardmäßig für seine übergeordneten Module nicht zugänglich. Um ein Modul öffentlich zu From 16adef35f13302359a2917c9e874e0c007bdf0df Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:48:12 +0200 Subject: [PATCH 17/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-for-referring-to-an-item-in-the-module-tree.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md b/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md index 3eebd340..a128976d 100644 --- a/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md +++ b/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md @@ -42,10 +42,10 @@ mod front_of_house { } pub fn eat_at_restaurant() { - // absoluter Pfad + // Absoluter Pfad crate::front_of_house::hosting::add_to_waitlist(); - // relativer Pfad + // Relativer Pfad front_of_house::hosting::add_to_waitlist(); } ``` @@ -148,7 +148,7 @@ den äußeren Code zu brechen. Rust gibt dir jedoch die Möglichkeit, innere Tei des Codes von Kindmodulen für äußere Vorgängermodule offenzulegen, indem du das Schlüsselwort `pub` verwendest, um ein Element öffentlich zu machen. -### Pfade mit dem Schlüsselwort `pub` öffnen +### Pfade mit dem Schlüsselwort `pub` öffentlich machen Kehren wir zum Fehler in Codeblock 7-4 zurück, der uns sagte, das Modul `hosting` sei privat. Wir wollen, dass die Funktion `eat_at_restaurant` im @@ -166,7 +166,7 @@ mod front_of_house { } pub fn eat_at_restaurant() { - // Absolutet Pfad + // Absoluter Pfad crate::front_of_house::hosting::add_to_waitlist(); // Relativer Pfad @@ -242,10 +242,10 @@ mod front_of_house { } pub fn eat_at_restaurant() { - // absoluter Path + // Absoluter Pfad crate::front_of_house::hosting::add_to_waitlist(); - // relativer Path + // Relativer Pfad front_of_house::hosting::add_to_waitlist(); } ``` @@ -285,7 +285,7 @@ Benutzern deiner Kiste, die festlegt, wie sie mit deinem Code interagieren können. Es gibt viele Überlegungen zum Umgang mit Änderungen an deiner öffentlichen API, um es für andere einfacher zu machen, sich auf deine Kiste zu verlassen. Diese Überlegungen liegen außerhalb des Rahmens dieses Buches; wenn -du an diesem Thema interessiert bist, lies [The Rust API +du an diesem Thema interessiert bist, lies die [Rust API Guidelines][api-guidelines]. > #### Bewährte Praktiken für Pakete mit einer Binärdatei und einer Bibliothek From d71be00055f06da3045271a32a265824279bc78d Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:51:58 +0200 Subject: [PATCH 18/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...inging-paths-into-scope-with-the-use-keyword.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ch07-04-bringing-paths-into-scope-with-the-use-keyword.md b/src/ch07-04-bringing-paths-into-scope-with-the-use-keyword.md index 8265cc81..669682f9 100644 --- a/src/ch07-04-bringing-paths-into-scope-with-the-use-keyword.md +++ b/src/ch07-04-bringing-paths-into-scope-with-the-use-keyword.md @@ -74,12 +74,6 @@ nicht mehr gilt: ```console $ cargo build Compiling restaurant v0.1.0 (file:///projects/restaurant) -error[E0433]: failed to resolve: use of undeclared crate or module `hosting` - --> src/lib.rs:11:9 - | -11 | hosting::add_to_waitlist(); - | ^^^^^^^ use of undeclared crate or module `hosting` - warning: unused import: `crate::front_of_house::hosting` --> src/lib.rs:7:5 | @@ -88,6 +82,12 @@ warning: unused import: `crate::front_of_house::hosting` | = note: `#[warn(unused_imports)]` on by default +error[E0433]: failed to resolve: use of undeclared crate or module `hosting` + --> src/lib.rs:11:9 + | +11 | hosting::add_to_waitlist(); + | ^^^^^^^ use of undeclared crate or module `hosting` + For more information about this error, try `rustc --explain E0433`. warning: `restaurant` (lib) generated 1 warning error: could not compile `restaurant` due to previous error; 1 warning emitted @@ -282,7 +282,7 @@ Projekt zu verwenden, fügten wir diese Zeile zu *Cargo.toml* hinzu: Dateiname: Cargo.toml ```toml -rand = "0.8.3" +rand = "0.8.5" ``` Das Hinzufügen von `rand` als Abhängigkeit in *Cargo.toml* weist Cargo an, das From 57cacd58a86398017dad19d36d1b16f43164af90 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:58:12 +0200 Subject: [PATCH 19/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch07-05-separating-modules-into-different-files.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ch07-05-separating-modules-into-different-files.md b/src/ch07-05-separating-modules-into-different-files.md index 90bd548f..42933adc 100644 --- a/src/ch07-05-separating-modules-into-different-files.md +++ b/src/ch07-05-separating-modules-into-different-files.md @@ -11,6 +11,13 @@ eigene Datei *src/front_of_house.rs*, indem wir die Kistenwurzeldatei so ist die Kistenwurzeldatei *src/lib.rs*, aber diese Vorgehensweise funktioniert auch mit binären Kisten, deren Kistenwurzeldatei *src/main.rs* ist. +Zuerst extrahieren wir das Modul `front_of_house` in eine eigene Datei. +Entferne den Code innerhalb der geschweiften Klammern des Moduls +`front_of_house` und lasse nur die Deklaration `mod front_of_house;` übrig, +sodass *src/lib.rs* den in Codeblock 7-21 gezeigten Code enthält. Beachte, dass +dies nicht kompiliert und wir noch die Datei *src/front_of_house.rs* in +Codeblock 7-22 erstellen müssen. + Dateiname: src/lib.rs ```rust,ignore From d0141b835a552f59de2b062e61a393b4cb6c09c8 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Wed, 12 Jul 2023 21:30:10 +0200 Subject: [PATCH 20/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch08-01-vectors.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ch08-01-vectors.md b/src/ch08-01-vectors.md index ceb69fae..d5ab1a8f 100644 --- a/src/ch08-01-vectors.md +++ b/src/ch08-01-vectors.md @@ -85,11 +85,11 @@ mittels Indexierungssyntax und der Methode `get`. let v = vec![1, 2, 3, 4, 5]; let third: &i32 = &v[2]; -println!("Das dritte Element ist {}", third); +println!("Das dritte Element ist {third}"); let third: Option<&i32> = v.get(2); match third { - Some(third) => println!("Das dritte Element ist {}", third), + Some(third) => println!("Das dritte Element ist {third}"), None => println!("Es gibt kein drittes Element."), } ``` @@ -154,7 +154,7 @@ let first = &v[0]; v.push(6); -println!("Das erste Element ist: {}", first); +println!("Das erste Element ist: {first}"); ``` Codeblock 8-6: Versuch, ein Element zu einem Vektor @@ -174,8 +174,8 @@ error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immuta 6 | v.push(6); | ^^^^^^^^^ mutable borrow occurs here 7 | -8 | println!("Das erste Element ist: {}", first); - | ----- immutable borrow later used here +8 | println!("Das erste Element ist: {first}"); + | ----- immutable borrow later used here For more information about this error, try `rustc --explain E0502`. error: could not compile `collections` due to previous error @@ -206,7 +206,7 @@ Vektors von `i32`-Werten zu erhalten und diese auszugeben. ```rust let v = vec![100, 32, 57]; for i in &v { - println!("{}", i); + println!("{i}"); } ``` From 83e88d4083e7726a26f9efa2b277ffc5eacf859a Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Wed, 12 Jul 2023 21:42:00 +0200 Subject: [PATCH 21/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch08-02-strings.md | 45 ++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/ch08-02-strings.md b/src/ch08-02-strings.md index ad6f486f..2ee25b2a 100644 --- a/src/ch08-02-strings.md +++ b/src/ch08-02-strings.md @@ -37,18 +37,6 @@ dieser Typen. Obwohl es in diesem Abschnitt weitgehend um `String` geht, werden beide Typen in Rusts Standardbibliothek stark verwendet, und sowohl `String` als auch Zeichenkettenanteilstypen sind UTF-8-kodiert. -Die Standardbibliothek von Rust enthält auch eine Reihe anderer -Zeichenkettentypen wie `OsString`, `OsStr`, `CString` und `CStr`. -Bibliothekskisten (library crates) können noch weitere Möglichkeiten zum -Speichern von Zeichenkettendaten bieten. Fällt dir auf, dass diese Namen alle -auf `String` oder `Str` enden? Sie beziehen sich auf aneigenbare und -ausgeliehene Varianten, genau wie die Typen `String` und `str`, die du zuvor -gesehen hast. Diese Zeichenkettentypen können z.B. Text in verschiedenen -Kodierungen speichern oder unterschiedliche Speicherdarstellungen haben. Diese -anderen Zeichenkettentypen werden in diesem Kapitel nicht besprochen; in ihrer -API-Dokumentation erfährst du mehr darüber, wie sie zu verwenden sind und wozu -jeder einzelne geeignet ist. - ### Erstellen einer neuen Zeichenkette Viele der gleichen Operationen, die mit `Vec` verfügbar sind, sind auch mit @@ -84,7 +72,7 @@ let s = "initialer Inhalt".to_string(); Codeblock 8-12: Verwenden der Methode `to_string` zum Erzeugen eines `String` aus einem Zeichenkettenliteral -Dieser Code erzeugt eine Zeichenkette mit dem Inhalt `initialer Inhalt`. +Dieser Code erzeugt eine Zeichenkette, die `initialer Inhalt` enthält. Wir können auch die Funktion `String::from` verwenden, um einen `String` aus einem Zeichenkettenliteral zu erzeugen. Der Code in Codeblock 8-13 ist @@ -158,7 +146,7 @@ Inhalt an `s1` angehängt haben. let mut s1 = String::from("foo"); let s2 = "bar"; s1.push_str(s2); -println!("s2 ist {}", s2); +println!("s2 ist {s2}"); ``` Codeblock 8-16: Verwenden eines Zeichenkettenanteilstyps @@ -259,7 +247,7 @@ let s1 = String::from("tic"); let s2 = String::from("tac"); let s3 = String::from("toe"); -let s = format!("{}-{}-{}", s1, s2, s3); +let s = format!("{s1}-{s2}-{s3}"); ``` Auch bei diesem Code wird `s` den Wert `tic-tac-toe` haben. Das Makro `format!` @@ -280,8 +268,6 @@ ungültigen Code in Codeblock 8-19. ```rust,does_not_compile let s1 = String::from("Hallo"); let h = s1[0]; - - ``` Codeblock 8-19: Versuch, die Indexierungssyntax bei einer @@ -299,6 +285,13 @@ error[E0277]: the type `String` cannot be indexed by `{integer}` | ^^^^^ `String` cannot be indexed by `{integer}` | = help: the trait `Index<{integer}>` is not implemented for `String` + = help: the following other types implement trait `Index`: + >> + > + >> + >> + >> + >> For more information about this error, try `rustc --explain E0277`. error: could not compile `collections` due to previous error @@ -322,7 +315,7 @@ In diesem Fall wird `hello.len()` gleich 4 sein, was bedeutet, dass der Vektor, der die Zeichenkette „Hola“ speichert, 4 Bytes lang ist. Jeder dieser Buchstaben benötigt 1 Byte in UTF-8-Kodierung. Die folgende Zeile mag dich jedoch überraschen. (Beachte, dass diese Zeichenkette mit dem kyrillischen -Großbuchstaben „Ze“ beginnt, nicht mit der arabischen Zahl 3.) +Großbuchstaben „Ze“ beginnt, nicht mit der Zahl 3.) ```rust let hello = String::from("Здравствуйте"); @@ -338,8 +331,6 @@ Um das zu erläutern, betrachte diesen ungültigen Rust-Code: ```rust,does_not_compile let hello = "Здравствуйте"; let answer = &hello[0]; - - ``` Du weißt bereits, dass `answer` nicht `З`, der erste Buchstabe, sein wird. In @@ -395,12 +386,14 @@ Hindi-Wort besteht: Rust bietet verschiedene Möglichkeiten zur Interpretation von rohen Zeichenkettendaten, die von Computern gespeichert werden, sodass jedes Programm die Interpretation wählen kann, die es benötigt, unabhängig davon, in welcher -menschlichen Sprache die Daten vorliegen. Ein letzter Grund, warum Rust uns -nicht erlaubt, eine Zeichenkette zu indexieren, um ein Zeichen zu erhalten, -ist, dass von Indexoperationen erwartet wird, dass sie immer in konstanter Zeit -(O(1)) erfolgen. Es ist jedoch nicht möglich, diese Zeitgarantie bei einem -`String` einzuhalten, da Rust den Inhalt von Anfang an bis zum Index durchgehen -müsste, um festzustellen, wie viele gültige Zeichen es gibt. +menschlichen Sprache die Daten vorliegen. + +Ein letzter Grund, warum Rust uns nicht erlaubt, eine Zeichenkette zu +indexieren, um ein Zeichen zu erhalten, ist, dass von Indexoperationen erwartet +wird, dass sie immer in konstanter Zeit (O(1)) erfolgen. Es ist jedoch nicht +möglich, diese Zeitgarantie bei einem `String` einzuhalten, da Rust den Inhalt +von Anfang an bis zum Index durchgehen müsste, um festzustellen, wie viele +gültige Zeichen es gibt. ### Anteilige Zeichenketten From 8d4da5192f84debc7c96781f820138747473864b Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Wed, 12 Jul 2023 21:48:42 +0200 Subject: [PATCH 22/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch08-03-hash-maps.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/ch08-03-hash-maps.md b/src/ch08-03-hash-maps.md index 4885876e..9895ee7a 100644 --- a/src/ch08-03-hash-maps.md +++ b/src/ch08-03-hash-maps.md @@ -7,12 +7,14 @@ wie er diese Schlüssel und Werte im Speicher ablegt. Viele Programmiersprachen unterstützen diese Art Datenstruktur, aber sie verwenden oft einen anderen Namen, z.B. Hash, Abbildung (map), Objekt, Hashtabelle (hash table), Wörterbuch (dictionary) oder assoziatives Array (associative array), um nur einige zu -nennen. Hashtabellen sind nützlich, wenn du Daten nicht wie bei Vektoren über -einen Index nachschlagen willst, sondern über einen Schlüssel, der ein -beliebiger Typ sein kann. Beispielsweise könntest du in einem Spiel den -Spielstand jedes Teams in einer Hashtabelle vermerken, in der die Schlüssel den -Teamnamen und die Werte den Spielstand des jeweiligen Teams darstellen. Wenn du -den Namen eines Teams angibst, kannst du seine Punktzahl abrufen. +nennen. + +Hashtabellen sind nützlich, wenn du Daten nicht wie bei Vektoren über einen +Index nachschlagen willst, sondern über einen Schlüssel, der ein beliebiger Typ +sein kann. Beispielsweise könntest du in einem Spiel den Spielstand jedes Teams +in einer Hashtabelle vermerken, in der die Schlüssel den Teamnamen und die +Werte den Spielstand des jeweiligen Teams darstellen. Wenn du den Namen eines +Teams angibst, kannst du seine Punktzahl abrufen. In diesem Abschnitt gehen wir die grundlegende Programmierschnittstelle (API) von Hashtabellen durch, aber viele weitere Leckerbissen verbergen sich in den @@ -174,7 +176,7 @@ einen bestimmten Schlüssel Dieser Code wird `{"Blau": 25}` ausgeben. Der ursprüngliche Wert `10` wurde überschrieben. -#### Nur einen Schlüssel und Wert einfügen, wenn der Schlüssel nicht vorhanden ist +#### Einen Schlüssel und Wert nur dann einfügen, wenn der Schlüssel nicht vorhanden ist Es ist üblich, zu prüfen, ob ein bestimmter Schlüssel bereits in der Hashtabelle mit einem Wert vorhanden ist, und dann folgende Maßnahmen zu From c586cdacaa6d7aa9d13d8927da582ff31adf2e96 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Wed, 12 Jul 2023 21:56:11 +0200 Subject: [PATCH 23/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch09-02-recoverable-errors-with-result.md | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/ch09-02-recoverable-errors-with-result.md b/src/ch09-02-recoverable-errors-with-result.md index b2cef804..5f6f9a7f 100644 --- a/src/ch09-02-recoverable-errors-with-result.md +++ b/src/ch09-02-recoverable-errors-with-result.md @@ -248,7 +248,8 @@ der Fehlerursache erleichtern. Die Syntax von `expect` sieht wie folgt aus: use std::fs::File; fn main() { - let greeting_file = File::open("hallo.txt").expect("Problem beim Öffnen von hallo.txt"); + let greeting_file = File::open("hallo.txt") + .expect("Problem beim Öffnen von hallo.txt"); } ``` @@ -362,9 +363,10 @@ Absturz bringen, einen Standardbenutzernamen verwenden oder den Benutzernamen von irgendwo anders als z.B. einer Datei nachschlagen. Wir haben nicht genug Informationen darüber, was der aufrufende Code tatsächlich versucht, also propagieren wir alle Erfolgs- und Fehlerinformationen nach oben, damit sie -angemessen behandelt werden. Dieses Muster der Fehlerweitergabe ist in Rust so -verbreitet, dass Rust den Fragezeichen-Operator `?` bereitstellt, um dies zu -erleichtern. +angemessen behandelt werden. + +Dieses Muster der Fehlerweitergabe ist in Rust so verbreitet, dass Rust den +Fragezeichen-Operator `?` bereitstellt, um dies zu erleichtern. #### Abkürzung zum Weitergeben von Fehlern: Der Operator `?` @@ -518,15 +520,14 @@ kompilieren, erhalten wir folgende Fehlermeldung: $ cargo run Compiling error-handling v0.1.0 (file:///projects/error-handling) error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`) - --> src/main.rs:4:48 - | -3 | / fn main() { -4 | | let f = File::open("hallo.txt")?; - | | ^ cannot use the `?` operator in a function that returns `()` -5 | | } - | |_- this function should return `Result` or `Option` to accept `?` - | - = help: the trait `FromResidual>` is not implemented for `()` + --> src/main.rs:4:48 + | +3 | fn main() { + | --------- this function should return `Result` or `Option` to accept `?` +4 | let greeting_file = File::open("hallo.txt")?; + | ^ cannot use the `?` operator in a function that returns `()` + | + = help: the trait `FromResidual>` is not implemented for `()` For more information about this error, try `rustc --explain E0277`. error: could not compile `error-handling` due to previous error From a3175af71e75e3fe81930104ddf4031396f7a8c8 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Wed, 12 Jul 2023 22:03:26 +0200 Subject: [PATCH 24/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch10-01-syntax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch10-01-syntax.md b/src/ch10-01-syntax.md index e30f976a..e10acce9 100644 --- a/src/ch10-01-syntax.md +++ b/src/ch10-01-syntax.md @@ -152,7 +152,7 @@ error[E0369]: binary operation `>` cannot be applied to type `&T` help: consider restricting type parameter `T` | 1 | fn largest(list: &[T]) -> &T { - | ^^^^^^^^^^^^^^^^^^^^^^ + | ++++++++++++++++++++++ For more information about this error, try `rustc --explain E0369`. error: could not compile `chapter10` due to previous error From 06d19ff1195f957705d7a6d176a2223eb568f4c0 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Wed, 12 Jul 2023 22:05:29 +0200 Subject: [PATCH 25/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch10-02-traits.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ch10-02-traits.md b/src/ch10-02-traits.md index 10902d7e..f916656f 100644 --- a/src/ch10-02-traits.md +++ b/src/ch10-02-traits.md @@ -212,7 +212,7 @@ Infolgedessen können wir immer noch die Methode `summarize` einer # # fn main() { let article = NewsArticle { - headline: String::from("Pinguine gewinnen die Stanley-Cup-Meisterschaft!"), + headline: String::from("Penguins gewinnen die Stanley-Cup-Meisterschaft!"), location: String::from("Pittsburgh, PA, USA"), author: String::from("Iceburgh"), content: String::from("Die Pittsburgh Penguins sind erneut die beste \ @@ -516,7 +516,7 @@ fn returns_summarizable(switch: bool) -> impl Summary { if switch { NewsArticle { headline: String::from( - "Pinguine gewinnen die Stanley-Cup-Meisterschaft!", + "Penguins gewinnen die Stanley-Cup-Meisterschaft!", ), location: String::from("Pittsburgh, PA, USA"), author: String::from("Iceburgh"), From b3560330d68c2c6248f59df8258ab2de3f634e23 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 20:39:14 +0200 Subject: [PATCH 26/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch10-03-lifetime-syntax.md | 73 +++++++++++++++------------------- 1 file changed, 33 insertions(+), 40 deletions(-) diff --git a/src/ch10-03-lifetime-syntax.md b/src/ch10-03-lifetime-syntax.md index 031cb5e1..dcfdb39f 100644 --- a/src/ch10-03-lifetime-syntax.md +++ b/src/ch10-03-lifetime-syntax.md @@ -34,16 +34,14 @@ Gültigkeitsbereich hat. ```rust,does_not_compile fn main() { - { - let r; - - { - let x = 5; - r = &x; - } + let r; - println!("r: {}", r); + { + let x = 5; + r = &x; } + + println!("r: {}", r); } ``` @@ -69,15 +67,15 @@ versuchen, ihn zu verwenden. Hier ist die Fehlermeldung: $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10) error[E0597]: `x` does not live long enough - --> src/main.rs:7:17 - | -7 | r = &x; - | ^^ borrowed value does not live long enough -8 | } - | - `x` dropped here while still borrowed -9 | -10 | println!("r: {}", r); - | - borrow later used here + --> src/main.rs:6:13 + | +6 | r = &x; + | ^^ borrowed value does not live long enough +7 | } + | - `x` dropped here while still borrowed +8 | +9 | println!("r: {}", r); + | - borrow later used here For more information about this error, try `rustc --explain E0597`. error: could not compile `chapter10` due to previous error @@ -101,18 +99,16 @@ sind. Codeblock 10-17 zeigt den gleichen Code wie Codeblock 10-16, jedoch mit Annotationen, die die Lebensdauer der Variablen angeben. ```rust,does_not_compile -# fn main() { - { - let r; // ---------+-- 'a - // | - { // | - let x = 5; // -+-- 'b | - r = &x; // | | - } // -+ | - // | - println!("r: {}", r); // | - } // ---------+ -# } +fn main() { + let r; // ---------+-- 'a + // | + { // | + let x = 5; // -+-- 'b | + r = &x; // | | + } // -+ | + // | + println!("r: {}", r); // | +} // ---------+ ``` Codeblock 10-17: Annotationen der Lebensdauern von `r` @@ -131,15 +127,13 @@ Referenz hat und fehlerfrei kompiliert werden kann. ```rust fn main() { - { - let x = 5; // ----------+-- 'b - // | - let r = &x; // --+-- 'a | - // | | - println!("r: {}", r); // | | - // --+ | - } // ----------+ -} + let x = 5; // ----------+-- 'b + // | + let r = &x; // --+-- 'a | + // | | + println!("r: {}", r); // | | + // --+ | +} // ----------+ ``` Codeblock 10-18: Eine gültige Referenz, da die Daten eine @@ -217,7 +211,6 @@ noch nicht kompiliert Stattdessen erhalten wir folgenden Fehler, der von Lebensdauern spricht: ```console -$ cargo run $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10) error[E0106]: missing lifetime specifier @@ -230,7 +223,7 @@ error[E0106]: missing lifetime specifier help: consider introducing a named lifetime parameter | 9 | fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { - | ^^^^ ^^^^^^^ ^^^^^^^ ^^^ + | ++++ ++ ++ ++ For more information about this error, try `rustc --explain E0106`. error: could not compile `chapter10` due to previous error From a1316769c8e8ae48dae1b3bf84ac8233a4a8d3be Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 20:52:59 +0200 Subject: [PATCH 27/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch11-01-writing-tests.md | 100 ++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 48 deletions(-) diff --git a/src/ch11-01-writing-tests.md b/src/ch11-01-writing-tests.md index 455f5e7b..22878323 100644 --- a/src/ch11-01-writing-tests.md +++ b/src/ch11-01-writing-tests.md @@ -83,18 +83,18 @@ Codeblock 11-2 zu sehen ist. $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.57s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test test tests::it_works ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Codeblock 11-2: Ergebnis der Ausführung des automatisch @@ -156,18 +156,18 @@ anstelle von `it_works`: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.59s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test test tests::exploration ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Fügen wir einen weiteren Test hinzu, aber dieses Mal machen wir einen Test, der @@ -207,7 +207,7 @@ Codeblock 11-4 aussehen, was zeigt, dass unser Test `exploration` bestanden und $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.72s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests test tests::another ... FAILED @@ -216,15 +216,16 @@ test tests::exploration ... ok failures: ---- tests::another stdout ---- -thread 'main' panicked at 'Lasse diesen Test fehlschlagen', src/lib.rs:10:9 +thread 'tests::another' panicked at 'Lasse diesen Test fehlschlagen', src/lib.rs:10:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + failures: tests::another -test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Codeblock 11-4: Testergebnisse, wenn ein Test bestanden @@ -350,18 +351,18 @@ also sollte unser Test erfolgreich sein. Lass es uns herausfinden! $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished test [unoptimized + debuginfo] target(s) in 0.66s - Running unittests (target/debug/deps/rectangle-6584c4561e48942e) + Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 1 test test tests::larger_can_hold_smaller ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests rectangle running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Es funktioniert! Fügen wir noch einen weiteren Test hinzu, diesmal mit der @@ -426,19 +427,19 @@ Rückgabewert `false` hat: $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished test [unoptimized + debuginfo] target(s) in 0.66s - Running unittests (target/debug/deps/rectangle-6584c4561e48942e) + Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 2 tests test tests::larger_can_hold_smaller ... ok test tests::smaller_cannot_hold_larger ... ok -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests rectangle running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Zwei Tests, die erfolgreich sind! Nun wollen wir sehen, was mit unseren @@ -501,7 +502,7 @@ Das Ausführen der Tests ergibt nun Folgendes: $ cargo test Compiling rectangle v0.1.0 (file:///projects/rectangle) Finished test [unoptimized + debuginfo] target(s) in 0.66s - Running unittests (target/debug/deps/rectangle-6584c4561e48942e) + Running unittests src/lib.rs (target/debug/deps/rectangle-6584c4561e48942e) running 2 tests test tests::larger_can_hold_smaller ... FAILED @@ -510,16 +511,16 @@ test tests::smaller_cannot_hold_larger ... ok failures: ---- tests::larger_can_hold_smaller stdout ---- -thread 'main' panicked at 'assertion failed: larger.can_hold(&smaller)', src/lib.rs:28:9 +thread 'tests::larger_can_hold_smaller' panicked at 'assertion failed: larger.can_hold(&smaller)', src/lib.rs:28:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::larger_can_hold_smaller -test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Unsere Tests haben den Fehler entdeckt! Da `larger.width` gleich 8 ist und @@ -572,18 +573,18 @@ Lass uns prüfen, ob sie den Test besteht! $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.58s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test test tests::it_adds_two ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Wir übergeben `4` als Argument an `assert_eq!`, was identisch mit dem Ergebnis @@ -617,7 +618,7 @@ Führe die Tests erneut aus: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.61s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test test tests::it_adds_two ... FAILED @@ -625,17 +626,18 @@ test tests::it_adds_two ... FAILED failures: ---- tests::it_adds_two stdout ---- -thread 'main' panicked at 'assertion failed: `(left == right)` +thread 'tests::it_adds_two' panicked at 'assertion failed: `(left == right)` left: `4`, right: `5`', src/lib.rs:11:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + failures: tests::it_adds_two -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Unser Test hat den Fehler entdeckt! Der Test `it_adds_two` schlug fehl und die @@ -750,7 +752,7 @@ Das Ausführen dieses Tests führt zu folgender Ausgabe: $ cargo test Compiling greeter v0.1.0 (file:///projects/greeter) Finished test [unoptimized + debuginfo] target(s) in 0.91s - Running unittests (target/debug/deps/greeter-170b942eb5bf5e3a) + Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a) running 1 test test tests::greeting_contains_name ... FAILED @@ -758,15 +760,16 @@ test tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ---- -thread 'main' panicked at 'assertion failed: result.contains("Carol")', src/lib.rs:12:9 +thread 'tests::greeting_contains_name' panicked at 'assertion failed: result.contains(\"Carol\")', src/lib.rs:12:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + failures: tests::greeting_contains_name -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Dieses Ergebnis zeigt nur an, dass die Zusicherung fehlgeschlagen ist und in @@ -804,7 +807,7 @@ Fehlermeldung: $ cargo test Compiling greeter v0.1.0 (file:///projects/greeter) Finished test [unoptimized + debuginfo] target(s) in 0.93s - Running unittests (target/debug/deps/greeter-170b942eb5bf5e3a) + Running unittests src/lib.rs (target/debug/deps/greeter-170b942eb5bf5e3a) running 1 test test tests::greeting_contains_name ... FAILED @@ -812,15 +815,16 @@ test tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ---- -thread 'main' panicked at 'Begrüßung enthielt nicht den Namen, Wert war `Hallo!`', src/lib.rs:12:9 +thread 'tests::greeting_contains_name' panicked at 'Begrüßung enthielt nicht den Namen, Wert war `Hallo!`', src/lib.rs:12:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + failures: tests::greeting_contains_name -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Wir können den Wert, den wir tatsächlich erhalten haben, in der Testausgabe @@ -885,18 +889,18 @@ wenn dieser Test bestanden ist: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished test [unoptimized + debuginfo] target(s) in 0.58s - Running unittests (target/debug/deps/guessing_game-57d70c3acb738f4d) + Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test test tests::greater_than_100 - should panic ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests guessing_game running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Sieht gut aus! Lass uns nun einen Fehler in unseren Code einbringen, indem wir @@ -937,7 +941,7 @@ Wenn wir den Test in Codeblock 11-8 ausführen, wird er fehlschlagen: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished test [unoptimized + debuginfo] target(s) in 0.62s - Running unittests (target/debug/deps/guessing_game-57d70c3acb738f4d) + Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test test tests::greater_than_100 - should panic ... FAILED @@ -950,9 +954,9 @@ note: test did not panic as expected failures: tests::greater_than_100 -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Wir erhalten in diesem Fall keine sehr hilfreiche Meldung, aber wenn wir uns @@ -995,7 +999,7 @@ mod tests { use super::*; #[test] - #[should_panic(expected = "Schätzwert muss kleiner oder gleich 100 sein")] + #[should_panic(expected = "kleiner oder gleich 100")] fn greater_than_100() { Guess::new(200); } @@ -1044,7 +1048,7 @@ vertauschen: # use super::*; # # #[test] -# #[should_panic(expected = "Guess value must be less than or equal to 100")] +# #[should_panic(expected = "kleiner oder gleich 100")] # fn greater_than_100() { # Guess::new(200); # } @@ -1057,7 +1061,7 @@ Wenn wir diesmal den `should_panic`-Test ausführen, wird er fehlschlagen: $ cargo test Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished test [unoptimized + debuginfo] target(s) in 0.66s - Running unittests (target/debug/deps/guessing_game-57d70c3acb738f4d) + Running unittests src/lib.rs (target/debug/deps/guessing_game-57d70c3acb738f4d) running 1 test test tests::greater_than_100 - should panic ... FAILED @@ -1065,18 +1069,18 @@ test tests::greater_than_100 - should panic ... FAILED failures: ---- tests::greater_than_100 stdout ---- -thread 'main' panicked at 'Schätzwert muss größer oder gleich 1 sein, ist 200.', src/lib.rs:13:13 +thread 'tests::greater_than_100' panicked at 'Schätzwert muss größer oder gleich 1 sein, ist 200.', src/lib.rs:13:13 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace note: panic did not contain expected string panic message: `"Schätzwert muss größer oder gleich 1 sein, ist 200."`, - expected substring: `"Schätzwert muss kleiner oder gleich 100 sein"` + expected substring: `"kleiner oder gleich 100"` failures: tests::greater_than_100 -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Die Fehlermeldung zeigt an, dass dieser Test tatsächlich wie erwartet das From 3cdc8152504c8eb66aa25eeac82a6de35110aa22 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 20:57:06 +0200 Subject: [PATCH 28/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch11-02-running-tests.md | 49 +++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/ch11-02-running-tests.md b/src/ch11-02-running-tests.md index 4395bc66..ebc2179f 100644 --- a/src/ch11-02-running-tests.md +++ b/src/ch11-02-running-tests.md @@ -105,7 +105,7 @@ sehen: $ cargo test Compiling silly-function v0.1.0 (file:///projects/silly-function) Finished test [unoptimized + debuginfo] target(s) in 0.58s - Running unittests (target/debug/deps/silly_function-160869f38cff9166) + Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166) running 2 tests test tests::this_test_will_fail ... FAILED @@ -114,18 +114,19 @@ test tests::this_test_will_pass ... ok failures: ---- tests::this_test_will_fail stdout ---- -Ich habe den Wert 8 erhalten. -thread 'main' panicked at 'assertion failed: `(left == right)` +I got the value 8 +thread 'tests::this_test_will_fail' panicked at 'assertion failed: `(left == right)` left: `5`, right: `10`', src/lib.rs:19:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + failures: tests::this_test_will_fail -test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Beachte, dass wir nirgendwo in dieser Ausgabe `Ich habe den Wert 4 erhalten.` @@ -149,7 +150,7 @@ ausführen, sehen wir folgende Ausgabe: $ cargo test -- --show-output Compiling silly-function v0.1.0 (file:///projects/silly-function) Finished test [unoptimized + debuginfo] target(s) in 0.60s - Running unittests (target/debug/deps/silly_function-160869f38cff9166) + Running unittests src/lib.rs (target/debug/deps/silly_function-160869f38cff9166) running 2 tests test tests::this_test_will_fail ... FAILED @@ -160,24 +161,26 @@ successes: ---- tests::this_test_will_pass stdout ---- Ich habe den Wert 4 erhalten. + successes: tests::this_test_will_pass failures: ---- tests::this_test_will_fail stdout ---- -Ich habe den Wert 8 erhalten. -thread 'main' panicked at 'assertion failed: `(left == right)` +I got the value 8 +thread 'tests::this_test_will_fail' panicked at 'assertion failed: `(left == right)` left: `5`, right: `10`', src/lib.rs:19:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + failures: tests::this_test_will_fail -test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` ### Ausführen einer Test-Teilmenge mittels Name @@ -230,20 +233,20 @@ Tests parallel laufen: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.62s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 3 tests test tests::add_three_and_two ... ok test tests::add_two_and_two ... ok test tests::one_hundred ... ok -test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` #### Ausführen einzelner Tests @@ -255,12 +258,12 @@ um nur diesen Test auszuführen: $ cargo test one_hundred Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.69s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test test tests::one_hundred ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s ``` Nur der Test mit dem Namen `one_hundred` lief; die beiden anderen Tests passten @@ -283,13 +286,13 @@ Tests `add` enthalten, können wir diese beiden Tests ausführen, indem wir $ cargo test add Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.61s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests test tests::add_three_and_two ... ok test tests::add_two_and_two ... ok -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s ``` Dieser Befehl führte alle Tests mit `add` im Namen aus und filterte den Test @@ -328,19 +331,19 @@ aber `expensive_test` nicht: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.60s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 2 tests test expensive_test ... ignored test it_works ... ok -test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Die Funktion `expensive_test` wird als `ignored` aufgeführt. Wenn wir nur die @@ -351,18 +354,18 @@ angeben: $ cargo test -- --ignored Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.61s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test test expensive_test ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Indem du kontrollierst, welche Tests durchgeführt werden, kannst du From ac3dacfbf2000a2be91387a00bfbae86ac9397e7 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:00:27 +0200 Subject: [PATCH 29/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch11-03-test-organization.md | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/ch11-03-test-organization.md b/src/ch11-03-test-organization.md index 9efaa434..3cb71a88 100644 --- a/src/ch11-03-test-organization.md +++ b/src/ch11-03-test-organization.md @@ -133,7 +133,7 @@ adder ├── Cargo.lock ├── Cargo.toml ├── src -│   └── lib.rs +│ └── lib.rs └── tests └── integration_test.rs ``` @@ -167,26 +167,26 @@ Dateien in diesem Verzeichnis nur dann, wenn wir `cargo test` ausführen. Führe ```console $ cargo test Compiling adder v0.1.0 (file:///projects/adder) - Finished test [unoptimized + debuginfo] target(s) in 0.73s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Finished test [unoptimized + debuginfo] target(s) in 1.31s + Running unittests src/lib.rs (target/debug/deps/adder-1082c4b063a8fbe6) running 1 test test tests::internal ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - Running unittests (target/debug/deps/integration_test-82e7799c1bc62298) + Running tests/integration_test.rs (target/debug/deps/integration_test-1082c4b063a8fbe6) running 1 test test it_adds_two ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Die drei Abschnitte der Ausgabe umfassen die Modultests, den Integrationstest @@ -219,12 +219,12 @@ Tests in einer bestimmten Integrationstestdatei auszuführen, verwenden bei $ cargo test --test integration_test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.64s - Running unittests (target/debug/deps/integration_test-82e7799c1bc62298) + Running tests/integration_test.rs (target/debug/deps/integration_test-82e7799c1bc62298) running 1 test test it_adds_two ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Dieses Kommando führt nur die Tests in der Datei *tests/integration_test.rs* @@ -270,31 +270,31 @@ aufgerufen haben: $ cargo test Compiling adder v0.1.0 (file:///projects/adder) Finished test [unoptimized + debuginfo] target(s) in 0.89s - Running unittests (target/debug/deps/adder-92948b65e88960b4) + Running unittests src/lib.rs (target/debug/deps/adder-92948b65e88960b4) running 1 test test tests::internal ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - Running unittests (target/debug/deps/common-7064e1b6d2e271be) + Running tests/common.rs (target/debug/deps/common-92948b65e88960b4) running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - Running unittests (target/debug/deps/integration_test-82e7799c1bc62298) + Running tests/integration_test.rs (target/debug/deps/integration_test-92948b65e88960b4) running 1 test test it_adds_two ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Dass in den Testergebnissen `common` erscheint und dabei `running 0 tests` @@ -309,10 +309,10 @@ Projektverzeichnis sieht nun wie folgt aus: ├── Cargo.lock ├── Cargo.toml ├── src -│   └── lib.rs +│ └── lib.rs └── tests ├── common - │   └── mod.rs + │ └── mod.rs └── integration_test.rs ``` From 86f1c5aa783c632634c370d21328ed3caae50387 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:09:51 +0200 Subject: [PATCH 30/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch12-00-an-io-project.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ch12-00-an-io-project.md b/src/ch12-00-an-io-project.md index 482fda65..1fdddefb 100644 --- a/src/ch12-00-an-io-project.md +++ b/src/ch12-00-an-io-project.md @@ -43,8 +43,8 @@ gelernt hast: * Schreiben von Tests ([Kapitel 11][chap11]) Wir werden auch kurz Funktionsabschlüsse (closures), Iteratoren und -Merkmalsobjekte (trait objects) vorstellen, die in den Kapiteln [13][ch13] und -[17][ch17] ausführlich behandelt werden. +Merkmalsobjekte (trait objects) vorstellen, die in den Kapiteln [13][chap13] +und [17][chap17] ausführlich behandelt werden. [chap7]: ch07-00-managing-growing-projects-with-packages-crates-and-modules.html [chap8]: ch08-00-common-collections.html From 8f6c84aa7057d7034eb38b7e50d5d12aa3195209 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:12:40 +0200 Subject: [PATCH 31/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch12-01-accepting-command-line-arguments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch12-01-accepting-command-line-arguments.md b/src/ch12-01-accepting-command-line-arguments.md index e31fd102..b9cb97db 100644 --- a/src/ch12-01-accepting-command-line-arguments.md +++ b/src/ch12-01-accepting-command-line-arguments.md @@ -17,7 +17,7 @@ Programm mit `cargo run`, einer zu suchenden Zeichenkette und einem Pfad zu einer Datei, in der gesucht werden soll, auszuführen: ```console -$ cargo run searchstring example-filename.txt +$ cargo run -- searchstring example-filename.txt ``` Im Moment kann das von `cargo new` generierte Programm die Argumente, die wir From 50502d7fe29477eb03ba4d536c06aa8f76748289 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:14:33 +0200 Subject: [PATCH 32/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch12-02-reading-a-file.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch12-02-reading-a-file.md b/src/ch12-02-reading-a-file.md index 6e009319..325b05eb 100644 --- a/src/ch12-02-reading-a-file.md +++ b/src/ch12-02-reading-a-file.md @@ -72,7 +72,7 @@ Kommandozeilenargument laufen (weil wir den Suchteil noch nicht implementiert haben) und die Datei *poem.txt* als zweites Argument: ```console -$ cargo run the poem.txt +$ cargo run -- the poem.txt Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished dev [unoptimized + debuginfo] target(s) in 0.0s Running `target/debug/minigrep the poem.txt` From 075e8b137e546a6555c0eb7bf270b83617d2e4ed Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:19:57 +0200 Subject: [PATCH 33/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ch12-03-improving-error-handling-and-modularity.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ch12-03-improving-error-handling-and-modularity.md b/src/ch12-03-improving-error-handling-and-modularity.md index 84d2d587..a4decbbf 100644 --- a/src/ch12-03-improving-error-handling-and-modularity.md +++ b/src/ch12-03-improving-error-handling-and-modularity.md @@ -2,7 +2,6 @@ Um unser Programm zu verbessern, werden wir vier Probleme beheben, die mit der Struktur des Programms und dem Umgang mit potenziellen Fehlern zu tun haben. - Erstens erfüllt unsere Funktion `main` jetzt zwei Aufgaben: Sie parst Argumente und liest Dateien. Für eine so kleine Funktion ist dies kein großes Problem. Wenn wir jedoch unser Programm innerhalb der Funktion `main` weiter ausbauen, @@ -752,17 +751,17 @@ warning: unused `Result` that must be used --> src/main.rs:19:5 | 19 | run(config); - | ^^^^^^^^^^^^ + | ^^^^^^^^^^^ | - = note: `#[warn(unused_must_use)]` on by default = note: this `Result` may be an `Err` variant, which should be handled + = note: `#[warn(unused_must_use)]` on by default warning: `minigrep` (bin "minigrep") generated 1 warning Finished dev [unoptimized + debuginfo] target(s) in 0.71s Running `target/debug/minigrep the poem.txt` -Searching for the -In file poem.txt -With text: +Suche nach the +In Datei poem.txt +Mit text: I'm nobody! Who are you? Are you nobody, too? Then there's a pair of us - don't tell! From f752d984595aac82af163eaa43e8d77122d71b6d Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:25:11 +0200 Subject: [PATCH 34/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2-04-testing-the-librarys-functionality.md | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/ch12-04-testing-the-librarys-functionality.md b/src/ch12-04-testing-the-librarys-functionality.md index 7c545806..258ae900 100644 --- a/src/ch12-04-testing-the-librarys-functionality.md +++ b/src/ch12-04-testing-the-librarys-functionality.md @@ -217,7 +217,7 @@ Lass uns jetzt den Test ausführen: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished test [unoptimized + debuginfo] target(s) in 0.97s - Running target/debug/deps/minigrep-4672b652f7794785 + Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 1 test test tests::one_result ... FAILED @@ -225,17 +225,18 @@ test tests::one_result ... FAILED failures: ---- tests::one_result stdout ---- -thread 'main' panicked at 'assertion failed: `(left == right)` - left: `["safe, fast, productive."]`, +thread 'tests::one_result' panicked at 'assertion failed: `(left == right)` + left: `["sicher, schnell, produktiv."]`, right: `[]`', src/lib.rs:44:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + failures: tests::one_result -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Toll, der Test schlägt fehl, genau wie wir erwartet haben. Bringen wir den Test @@ -471,24 +472,24 @@ enthalten, und unser Test sollte erfolgreich sein. Lass uns den Test ausführen: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished test [unoptimized + debuginfo] target(s) in 1.22s - Running target/debug/deps/minigrep-4672b652f7794785 + Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 1 test test tests::one_result ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - Running target/debug/deps/minigrep-caf9dbee196c78b9 + Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests minigrep running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Unser Test war erfolgreich, also wissen wir, dass es funktioniert! From ebf1b194f0bf84be05c3830aea596af804aec334 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:30:12 +0200 Subject: [PATCH 35/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch12-05-working-with-environment-variables.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/ch12-05-working-with-environment-variables.md b/src/ch12-05-working-with-environment-variables.md index b8145390..f4f275ce 100644 --- a/src/ch12-05-working-with-environment-variables.md +++ b/src/ch12-05-working-with-environment-variables.md @@ -263,25 +263,25 @@ Warten wir ab, ob diese Implementierung die Tests besteht: $ cargo test Compiling minigrep v0.1.0 (file:///projects/minigrep) Finished test [unoptimized + debuginfo] target(s) in 1.33s - Running target/debug/deps/minigrep-4672b652f7794785 + Running unittests src/lib.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 2 tests test tests::case_insensitive ... ok test tests::case_sensitive ... ok -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - Running target/debug/deps/minigrep-caf9dbee196c78b9 + Running unittests src/main.rs (target/debug/deps/minigrep-9cd200e5fac0fc94) running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests minigrep running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Großartig! Sie haben bestanden. Lass uns nun die neue Funktion @@ -535,7 +535,7 @@ impl Config { let query = args[1].clone(); let file_path = args[2].clone(); - let case_sensitive = env::var("CASE_INSENSITIVE").is_err(); + let case_sensitive = env::var("IGNORE_CASE").is_err(); Ok(Config { query, @@ -686,9 +686,6 @@ Wir sollten Zeilen erhalten, die „to“ enthalten, die Großbuchstaben haben könnten: ```console -$ CASE_INSENSITIVE=1 cargo run to poem.txt - Finished dev [unoptimized + debuginfo] target(s) in 0.0s - Running `target/debug/minigrep to poem.txt` Are you nobody, too? How dreary to be somebody! To tell your name the livelong day From d722691c0d31e34b278caa94a7fa71a86daf4c67 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:36:16 +0200 Subject: [PATCH 36/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch13-01-closures.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ch13-01-closures.md b/src/ch13-01-closures.md index c2fca8b1..de1c7631 100644 --- a/src/ch13-01-closures.md +++ b/src/ch13-01-closures.md @@ -403,9 +403,9 @@ use std::thread; fn main() { let list = vec![1, 2, 3]; - println!("Before defining closure: {:?}", list); + println!("Vor der Funktionsabschlussdefinition: {:?}", list); - thread::spawn(move || println!("From thread: {:?}", list)) + thread::spawn(move || println!("Im Strang: {:?}", list)) .join() .unwrap(); } From 4ab518fef19ce0529405e58f8afbae63f572ebe0 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:37:49 +0200 Subject: [PATCH 37/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch13-02-iterators.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ch13-02-iterators.md b/src/ch13-02-iterators.md index 0fdb3636..cb91795d 100644 --- a/src/ch13-02-iterators.md +++ b/src/ch13-02-iterators.md @@ -205,10 +205,10 @@ warning: unused `Map` that must be used --> src/main.rs:4:5 | 4 | v1.iter().map(|x| x + 1); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: `#[warn(unused_must_use)]` on by default = note: iterators are lazy and do nothing unless consumed + = note: `#[warn(unused_must_use)]` on by default warning: `iterators` (bin "iterators") generated 1 warning Finished dev [unoptimized + debuginfo] target(s) in 0.47s From 25c2185cdc18ef993a12a754a3b883d814d2e4ef Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:47:39 +0200 Subject: [PATCH 38/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch14-02-publishing-to-crates-io.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ch14-02-publishing-to-crates-io.md b/src/ch14-02-publishing-to-crates-io.md index 25d47abe..0a4d181a 100644 --- a/src/ch14-02-publishing-to-crates-io.md +++ b/src/ch14-02-publishing-to-crates-io.md @@ -412,6 +412,12 @@ API-Schlüssel auf: ```console $ cargo login abcdefghijklmnopqrstuvwxyz012345 ``` + +Diese Kommando informiert Cargo über dein API-Token und speichert es lokal in +*~/.cargo/credentials*. Beachte, dass dieses Token ein *Geheimnis* ist: Gib es +nicht an andere weiter. Wenn du es aus irgendeinem Grund mit jemandem teilst, +solltest du es widerrufen und ein neues Token auf [crates.io][crates] erzeugen. + ### Metadaten zu einer neuen Kiste hinzufügen Angenommen, du hast eine Kiste, die du veröffentlichen möchtest. Vor dem From ca800792ff835961071b4ca3e7ff8dbb5b3dd10e Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:51:25 +0200 Subject: [PATCH 39/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch14-03-cargo-workspaces.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/ch14-03-cargo-workspaces.md b/src/ch14-03-cargo-workspaces.md index 62ed01be..93d5b715 100644 --- a/src/ch14-03-cargo-workspaces.md +++ b/src/ch14-03-cargo-workspaces.md @@ -154,11 +154,7 @@ use add_one; fn main() { let num = 10; - println!( - "Hello, world! {} plus one is {}!", - num, - add_one::add_one(num) - ); + println!("Hello, world! {num} plus one is {}!", add_one::add_one(num)); } ``` @@ -206,7 +202,7 @@ verwenden können: ```toml [dependencies] -rand = "0.8.3" +rand = "0.8.5" ``` Wir können nun `use rand;` zur Datei *add_one/src/lib.rs* hinzufügen, und wenn @@ -300,19 +296,19 @@ $ cargo test running 1 test test tests::it_works ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running unittests src/main.rs (target/debug/deps/adder-49979ff40686fa8e) running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add_one running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Der erste Abschnitt der Ausgabe zeigt, dass der Test `it_works` in der @@ -332,13 +328,13 @@ $ cargo test -p add_one running 1 test test tests::it_works ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add_one running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` Die Ausgabe zeigt, dass `cargo test` nur die Tests für die Kiste `add_one` aber From 147433c2f57418c395d36ab1a8a7649786e03459 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:54:26 +0200 Subject: [PATCH 40/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch15-01-box.md | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/ch15-01-box.md b/src/ch15-01-box.md index f6e36095..2684d0ca 100644 --- a/src/ch15-01-box.md +++ b/src/ch15-01-box.md @@ -169,7 +169,6 @@ enthält. Dieser `List`-Wert ist ein weiterer `Cons`, der `3` enthält und ein `List`, der schließlich `Nil` ist, die nicht rekursive Variante, die das Ende der Liste signalisiert. - Wenn wir versuchen den Programmcode in Codeblock 15-3 zu kompilieren, erhalten wir den Fehler der in Codeblock 15-4 gezeigt wird: @@ -180,27 +179,17 @@ error[E0072]: recursive type `List` has infinite size --> src/main.rs:1:1 | 1 | enum List { - | ^^^^^^^^^ recursive type has infinite size + | ^^^^^^^^^ 2 | Cons(i32, List), | ---- recursive without indirection | -help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `List` representable +help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle | 2 | Cons(i32, Box), | ++++ + -error[E0391]: cycle detected when computing drop-check constraints for `List` - --> src/main.rs:1:1 - | -1 | enum List { - | ^^^^^^^^^ - | - = note: ...which again requires computing drop-check constraints for `List`, completing the cycle - = note: cycle used when computing dropck types for `Canonical { max_universe: U0, variables: [], value: ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: List } }` - -Some errors have detailed explanations: E0072, E0391. -For more information about an error, try `rustc --explain E0072`. -error: could not compile `cons-list` due to 2 previous errors +For more information about this error, try `rustc --explain E0072`. +error: could not compile `cons-list` due to previous error ``` Codeblock 15-4: Der Fehler den wir erhalten wenn wir From fb1954ba34db7ee72be601a5d605f82de5f452e6 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:56:26 +0200 Subject: [PATCH 41/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch15-02-deref.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/ch15-02-deref.md b/src/ch15-02-deref.md index f345669b..3875debd 100644 --- a/src/ch15-02-deref.md +++ b/src/ch15-02-deref.md @@ -65,10 +65,20 @@ error[E0277]: can't compare `{integer}` with `&{integer}` --> src/main.rs:6:5 | 6 | assert_eq!(5, y); - | ^^^^^^^^^^^^^^^^^ no implementation for `{integer} == &{integer}` + | ^^^^^^^^^^^^^^^^ no implementation for `{integer} == &{integer}` | = help: the trait `PartialEq<&{integer}>` is not implemented for `{integer}` - = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z external-macro-backtrace for more info) + = help: the following other types implement trait `PartialEq`: + f32 + f64 + i128 + i16 + i32 + i64 + i8 + isize + and 6 others + = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) For more information about this error, try `rustc --explain E0277`. error: could not compile `deref-example` due to previous error From 2696392cd60acb74903bb4d6fa9b01519c10c820 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Thu, 13 Jul 2023 21:59:53 +0200 Subject: [PATCH 42/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch15-03-drop.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ch15-03-drop.md b/src/ch15-03-drop.md index d9885a74..473de0ce 100644 --- a/src/ch15-03-drop.md +++ b/src/ch15-03-drop.md @@ -43,7 +43,7 @@ struct CustomSmartPointer { impl Drop for CustomSmartPointer { fn drop(&mut self) { - println!("CustomSmartPointer und Daten aufräumen: `{}`!", self.data); + println!("CustomSmartPointer mit Daten aufräumen: `{}`!", self.data); } } @@ -84,8 +84,8 @@ $ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.60s Running `target/debug/drop-example` CustomSmartPointers erzeugt. -CustomSmartPointer und Daten aufräumen: `andere Sachen`! -CustomSmartPointer und Daten aufräumen: `meine Sache`! +CustomSmartPointer mit Daten aufräumen: `andere Sachen`! +CustomSmartPointer mit Daten aufräumen: `meine Sache`! ``` Rust hat für uns automatisch `drop` und den von uns angegebenen Programmcode aufgerufen, sobald unsere Instanzen den Gültigkeitsbereich verlassen haben. @@ -122,7 +122,7 @@ indem wir die `main`-Funktion aus Codeblock 15-14 ändern, wie im Codeblock # # impl Drop for CustomSmartPointer { # fn drop(&mut self) { -# println!("CustomSmartPointer und Daten aufräumen: `{}`!", self.data); +# println!("CustomSmartPointer mit Daten aufräumen: `{}`!", self.data); # } # } # @@ -189,7 +189,7 @@ Funktion befindet sich im Präludium, daher können wir `main` in Codeblock 15-1 # # impl Drop for CustomSmartPointer { # fn drop(&mut self) { -# println!("CustomSmartPointer und Daten aufräumen: `{}`!", self.data); +# println!("CustomSmartPointer mit Daten aufräumen: `{}`!", self.data); # } # } # @@ -214,11 +214,11 @@ $ cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.73s Running `target/debug/drop-example` CustomSmartPointer erzeugt. -CustomSmartPointer und Daten aufräumen: `Daten`! +CustomSmartPointer mit Daten aufräumen: `Daten`! CustomSmartPointer vor dem Ende von main aufgeräumt. ``` -Der Text ```CustomSmartPointer und Daten aufräumen: `Daten`!``` wird zwischen +Der Text ```CustomSmartPointer mit Daten aufräumen: `Daten`!``` wird zwischen `CustomSmartPointer erzeugt` und `CustomSmartPointer vor dem Ende von main aufgeräumt.` ausgegeben und zeigt, dass der `drop`-Methodencode aufgerufen wird um `c` an diesem Punkt aufzuräumen. From a4be112c43c3e549ace81ba8789266780878bd63 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 16:55:46 +0200 Subject: [PATCH 43/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch15-04-rc.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ch15-04-rc.md b/src/ch15-04-rc.md index 140f9e36..6489788b 100644 --- a/src/ch15-04-rc.md +++ b/src/ch15-04-rc.md @@ -189,7 +189,8 @@ fn main() { let c = Cons(4, Rc::clone(&a)); println!("Zähler nach der Erstellung von c = {}", Rc::strong_count(&a)); } - println!("Zahler nachdem c den Gültigkeitsbereich verlässt = {}", Rc::strong_count(&a)); + println!("Zahler nachdem c den Gültigkeitsbereich verlässt = {}", + Rc::strong_count(&a)); } ``` From 5eaa50edde87c6b349bae51c2b54580de58385a2 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 17:04:47 +0200 Subject: [PATCH 44/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch15-05-interior-mutability.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/ch15-05-interior-mutability.md b/src/ch15-05-interior-mutability.md index 2a8a587c..e199163d 100644 --- a/src/ch15-05-interior-mutability.md +++ b/src/ch15-05-interior-mutability.md @@ -342,13 +342,11 @@ error[E0596]: cannot borrow `self.sent_messages` as mutable, as it is behind a ` | ----- help: consider changing that to be a mutable reference: `&mut self` ... 58 | self.sent_messages.push(String::from(message)); - | ^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `self` is a `&` reference, so the data it refers to cannot be borrowed as mutable For more information about this error, try `rustc --explain E0596`. error: could not compile `limit-tracker` due to previous error - warning: build failed, waiting for other jobs to finish... -error: build failed ``` Wir können den `MockMessenger` nicht ändern, um die Nachrichten zu verfolgen, da @@ -594,7 +592,7 @@ test tests::it_sends_an_over_75_percent_warning_message ... FAILED failures: ---- tests::it_sends_an_over_75_percent_warning_message stdout ---- -thread 'main' panicked at 'already borrowed: BorrowMutError', src/lib.rs:60:53 +thread 'tests::it_sends_an_over_75_percent_warning_message' panicked at 'already borrowed: BorrowMutError', src/lib.rs:60:53 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace @@ -603,7 +601,7 @@ failures: test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -error: test failed, to rerun pass '--lib' +error: test failed, to rerun pass `--lib` ``` Beachte, dass der Programmcode mit der Meldung `already borrowed: BorrowMutError` abstürzt. Auf diese Weise behandelt `RefCell` zur @@ -661,9 +659,9 @@ fn main() { *value.borrow_mut() += 10; - println!("a after = {:?}", a); - println!("b after = {:?}", b); - println!("c after = {:?}", c); + println!("a nachher = {:?}", a); + println!("b nachher = {:?}", b); + println!("c nachher = {:?}", c); } ``` @@ -697,9 +695,9 @@ $ cargo run Compiling cons-list v0.1.0 (file:///projects/cons-list) Finished dev [unoptimized + debuginfo] target(s) in 0.63s Running `target/debug/cons-list` -a after = Cons(RefCell { value: 15 }, Nil) -b after = Cons(RefCell { value: 3 }, Cons(RefCell { value: 15 }, Nil)) -c after = Cons(RefCell { value: 4 }, Cons(RefCell { value: 15 }, Nil)) +a nachher = Cons(RefCell { value: 15 }, Nil) +b nachher = Cons(RefCell { value: 3 }, Cons(RefCell { value: 15 }, Nil)) +c nachher = Cons(RefCell { value: 4 }, Cons(RefCell { value: 15 }, Nil)) ``` Diese Technik ist ziemlich sauber! Durch die Verwendung von `RefCell` haben From 52b8c90aaba922c246f4f112f0c5de505249826c Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 17:12:19 +0200 Subject: [PATCH 45/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch15-06-reference-cycles.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ch15-06-reference-cycles.md b/src/ch15-06-reference-cycles.md index 4e8978c8..d7ec2896 100644 --- a/src/ch15-06-reference-cycles.md +++ b/src/ch15-06-reference-cycles.md @@ -211,12 +211,6 @@ verwendet `weak_count`, um den Überblick zu behalten wie viele Unterschied besteht darin, dass `weak_count` nicht 0 sein muss, damit die `Rc`-Instanz aufgeräumt wird. -Mit starken Referenzen kann man die Eigentümerschaft einer `Rc`-Instanz -teilen, schwache Referenzen drücken hingegen keine Eigentümerschafts-Beziehung -aus. Sie verursachen keinen Referenzzyklus, da jeder Zyklus mit schwachen -Referenzen unterbrochen wird, sobald die starke Referenzanzahl der beteiligten -Werte 0 beträgt. - Da der Wert, auf den `Weak` referenziert, möglicherweise aufgeräumt wurde, musst du sicherstellen, dass der Wert noch vorhanden ist, um etwas mit dem Wert zu tun, auf den ein `Weak` zeigt. Ruft man dazu die Methode `upgrade` für eine From e5ba731d4e55e6f2bbf6d1755e2c447469c9c057 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 17:17:13 +0200 Subject: [PATCH 46/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch16-01-threads.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch16-01-threads.md b/src/ch16-01-threads.md index 99db44bd..6b786fb1 100644 --- a/src/ch16-01-threads.md +++ b/src/ch16-01-threads.md @@ -282,7 +282,7 @@ note: function requires argument type to outlive `'static` help: to force the closure to take ownership of `v` (and any other referenced variables), use the `move` keyword | 6 | let handle = thread::spawn(move || { - | ^^^^^^^ + | ++++ For more information about this error, try `rustc --explain E0373`. error: could not compile `threads` due to previous error From 319baef59fed11f1aad6cf5c7681fee2617ea0c7 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 17:25:45 +0200 Subject: [PATCH 47/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch16-02-message-passing.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ch16-02-message-passing.md b/src/ch16-02-message-passing.md index 24846034..42e08ce4 100644 --- a/src/ch16-02-message-passing.md +++ b/src/ch16-02-message-passing.md @@ -219,6 +219,8 @@ error[E0382]: borrow of moved value: `val` | --- value moved here 10 | println!("val ist {}", val); | ^^^ value borrowed here after move + | + = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info) For more information about this error, try `rustc --explain E0382`. error: could not compile `message-passing` due to previous error From 971edbf3223e710806b1dd0ae4a3195b3060919f Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 17:29:03 +0200 Subject: [PATCH 48/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch16-03-shared-state.md | 38 +++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/ch16-03-shared-state.md b/src/ch16-03-shared-state.md index 5bf0e1c2..4f877974 100644 --- a/src/ch16-03-shared-state.md +++ b/src/ch16-03-shared-state.md @@ -242,20 +242,30 @@ lehrt uns eine Menge. $ cargo run Compiling shared-state v0.1.0 (file:///projects/shared-state) error[E0277]: `Rc>` cannot be sent between threads safely - --> src/main.rs:11:22 - | -11 | let handle = thread::spawn(move || { - | ______________________^^^^^^^^^^^^^_- - | | | - | | `Rc>` cannot be sent between threads safely -12 | | let mut num = counter.lock().unwrap(); -13 | | -14 | | *num += 1; -15 | | }); - | |_________- within this `[closure@src/main.rs:11:36: 15:10]` - | - = help: within `[closure@src/main.rs:11:36: 15:10]`, the trait `Send` is not implemented for `Rc>` - = note: required because it appears within the type `[closure@src/main.rs:11:36: 15:10]` + --> src/main.rs:11:36 + | +11 | let handle = thread::spawn(move || { + | ------------- ^------ + | | | + | ______________________|_____________within this `[closure@src/main.rs:11:36: 11:43]` + | | | + | | required by a bound introduced by this call +12 | | let mut num = counter.lock().unwrap(); +13 | | +14 | | *num += 1; +15 | | }); + | |_________^ `Rc>` cannot be sent between threads safely + | + = help: within `[closure@src/main.rs:11:36: 11:43]`, the trait `Send` is not implemented for `Rc>` +note: required because it's used within this closure + --> src/main.rs:11:36 + | +11 | let handle = thread::spawn(move || { + | ^^^^^^^ +note: required by a bound in `spawn` + --> /rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/std/src/thread/mod.rs:704:8 + | + = note: required by this bound in `spawn` For more information about this error, try `rustc --explain E0277`. error: could not compile `shared-state` due to previous error From 871eac7c494d01855750cb6914091cf88c0cc0b5 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 17:36:58 +0200 Subject: [PATCH 49/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch18-02-refutability.md | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/ch18-02-refutability.md b/src/ch18-02-refutability.md index c1674b53..e623484d 100644 --- a/src/ch18-02-refutability.md +++ b/src/ch18-02-refutability.md @@ -52,19 +52,27 @@ abweisbares Muster zu verwenden, wo ein unabweisbares Muster erforderlich ist: $ cargo run Compiling patterns v0.1.0 (file:///projects/patterns) error[E0005]: refutable pattern in local binding: `None` not covered - --> src/main.rs:3:9 - | -3 | let Some(x) = some_option_value; - | ^^^^^^^ pattern `None` not covered - | - = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant - = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html + --> src/main.rs:3:9 + | +3 | let Some(x) = some_option_value; + | ^^^^^^^ pattern `None` not covered + | + = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant + = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html note: `Option` defined here - = note: the matched value is of type `Option` + --> /rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/core/src/option.rs:518:1 + | + = note: +/rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/core/src/option.rs:522:5: not covered + = note: the matched value is of type `Option` help: you might want to use `if let` to ignore the variant that isn't matched - | -3 | let x = if let Some(x) = some_option_value { x } else { todo!() }; - | ++++++++++ ++++++++++++++++++++++ + | +3 | let x = if let Some(x) = some_option_value { x } else { todo!() }; + | ++++++++++ ++++++++++++++++++++++ +help: alternatively, you might want to use let else to handle the variant that isn't matched + | +3 | let Some(x) = some_option_value else { todo!() }; + | ++++++++++++++++ For more information about this error, try `rustc --explain E0005`. error: could not compile `patterns` due to previous error @@ -120,9 +128,9 @@ warning: irrefutable `if let` pattern 2 | if let x = 5 { | ^^^^^^^^^ | - = note: `#[warn(irrefutable_let_patterns)]` on by default = note: this pattern will always match, so the `if let` is useless = help: consider replacing the `if let` with a `let` + = note: `#[warn(irrefutable_let_patterns)]` on by default warning: `patterns` (bin "patterns") generated 1 warning Finished dev [unoptimized + debuginfo] target(s) in 0.39s From 3701319c43f3de11e5886a4494e8ef25e975b453 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 22:27:48 +0200 Subject: [PATCH 50/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch18-03-pattern-syntax.md | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/ch18-03-pattern-syntax.md b/src/ch18-03-pattern-syntax.md index d8f3781d..6e60457a 100644 --- a/src/ch18-03-pattern-syntax.md +++ b/src/ch18-03-pattern-syntax.md @@ -293,15 +293,11 @@ fn main() { println!("Die Quit-Variante hat keine Daten zu destrukturieren.") } Message::Move { x, y } => { - println!( - "Bewege in x-Richtung {} und in y-Richtung {}", - x, y - ); + println!("Bewege in x-Richtung {x} und in y-Richtung {y}"); } Message::Write(text) => println!("Textnachricht: {}", text), Message::ChangeColor(r, g, b) => println!( - "Ändere die Farbe in rot {}, grün {} und blau {}", - r, g, b + "Ändere die Farbe in rot {r}, grün {g} und blau {b}" ), } } @@ -356,14 +352,12 @@ fn main() { let msg = Message::ChangeColor(Color::Hsv(0, 160, 255)); match msg { - Message::ChangeColor(Color::Rgb(r, g, b)) => println!( - "Ändere die Farbe in rot {}, grün {} und blau {}", - r, g, b - ), - Message::ChangeColor(Color::Hsv(h, s, v)) => println!( - "Ändere die Farbe in Farbwert {}, Sättigung {} und Hellwert {}", - h, s, v - ), + Message::ChangeColor(Color::Rgb(r, g, b)) => { + println!("Ändere die Farbe in rot {r}, grün {g} und blau {b}"); + } + Message::ChangeColor(Color::Hsv(h, s, v)) => { + println!("Ändere die Farbe in Farbwert {h}, Sättigung {s} und Hellwert {v}") + } _ => (), } } From 4d88b47239446c61217aca02cad5577725b51c09 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 22:43:05 +0200 Subject: [PATCH 51/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch19-03-advanced-traits.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ch19-03-advanced-traits.md b/src/ch19-03-advanced-traits.md index c697dd74..acab90db 100644 --- a/src/ch19-03-advanced-traits.md +++ b/src/ch19-03-advanced-traits.md @@ -525,15 +525,21 @@ Kompilierfehler erhalten: ```console $ cargo run Compiling traits-example v0.1.0 (file:///projects/traits-example) -error[E0283]: type annotations needed +error[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type --> src/main.rs:20:43 | -20 | println!("A baby dog is called a {}", Animal::baby_name()); - | ^^^^^^^^^^^^^^^^^ cannot infer type +2 | fn baby_name() -> String; + | ------------------------- `Animal::baby_name` defined here +... +20 | println!("Ein Hundebaby wird {} genannt.", Animal::baby_name()); + | ^^^^^^^^^^^^^^^^^ cannot call associated function of trait | - = note: cannot satisfy `_: Animal` +help: use the fully-qualified path to the only available implementation + | +20 | println!("Ein Hundebaby wird {} genannt.", ::baby_name()); + | +++++++ + -For more information about this error, try `rustc --explain E0283`. +For more information about this error, try `rustc --explain E0790`. error: could not compile `traits-example` due to previous error ``` From cda41685a6dca883562d67bf0bbd0a12f84bf821 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 22:45:41 +0200 Subject: [PATCH 52/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch19-04-advanced-types.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/ch19-04-advanced-types.md b/src/ch19-04-advanced-types.md index 1980734a..b8b28548 100644 --- a/src/ch19-04-advanced-types.md +++ b/src/ch19-04-advanced-types.md @@ -375,18 +375,16 @@ machen die Typen `s1` und `s2` zu einem `&str` anstatt zu einem `str`. Erinnere dich, dass wir im Abschnitt [„Zeichenkettenanteilstypen (string slices)“][string-slices] in Kapitel 4 gesagt haben, dass die Anteilstypen-Datenstruktur die Startposition und die Länge des Anteilstyps -speichert. - -Obwohl also `&T` ein einzelner Wert ist, der die Speicheradresse des Ortes -speichert, an dem sich `T` befindet, hat `&str` *zwei* Werte: Die Adresse von -`str` und seine Länge. Als solches können wir die Größe eines `&str`-Wertes zur -Kompilierzeit kennen: Er ist doppelt so lang wie ein `usize`. Das heißt, wir -wissen immer die Größe einer `&str`, egal wie lang die Zeichenkette ist, auf -die sie sich bezieht. Im Allgemeinen werden in Rust Typen mit dynamischer Größe -auf diese Weise verwendet: Sie haben ein zusätzliches Stück Metadaten, das die -Größe der dynamischen Information speichert. Die goldene Regel für Typen -dynamischer Größe lautet, dass wir Werte von Typen mit dynamischer Größe immer -hinter eine Art Zeiger stellen müssen. +speichert. Obwohl also `&T` ein einzelner Wert ist, der die Speicheradresse des +Ortes speichert, an dem sich `T` befindet, hat `&str` *zwei* Werte: Die Adresse +von `str` und seine Länge. Als solches können wir die Größe eines `&str`-Wertes +zur Kompilierzeit kennen: Er ist doppelt so lang wie ein `usize`. Das heißt, +wir wissen immer die Größe einer `&str`, egal wie lang die Zeichenkette ist, +auf die sie sich bezieht. Im Allgemeinen werden in Rust Typen mit dynamischer +Größe auf diese Weise verwendet: Sie haben ein zusätzliches Stück Metadaten, +das die Größe der dynamischen Information speichert. Die goldene Regel für +Typen dynamischer Größe lautet, dass wir Werte von Typen mit dynamischer Größe +immer hinter eine Art Zeiger stellen müssen. Wir können `str` mit allen Arten von Zeigern kombinieren: Zum Beispiel `Box` oder `Rc`. Tatsächlich hast du das schon einmal gesehen, aber From 767770eb2be78e41572d16786267f94566fe1493 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sat, 15 Jul 2023 22:56:13 +0200 Subject: [PATCH 53/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch20-01-single-threaded.md | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/ch20-01-single-threaded.md b/src/ch20-01-single-threaded.md index 092cf71b..23fb4d2b 100644 --- a/src/ch20-01-single-threaded.md +++ b/src/ch20-01-single-threaded.md @@ -410,13 +410,13 @@ lesen, sie der Antwort als Rumpf hinzuzufügen und sie zu senden. Dateiname: src/main.rs ```rust,no_run -use std::fs; +use std::{ + fs, + io::{prelude::*, BufReader}, + net::{TcpListener, TcpStream}, +}; // --abschneiden-- -# use std::io::prelude::*; -# use std::net::TcpListener; -# use std::net::TcpStream; -# # fn main() { # let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); # @@ -428,19 +428,21 @@ use std::fs; # } # fn handle_connection(mut stream: TcpStream) { - let mut buffer = [0; 1024]; - stream.read(&mut buffer).unwrap(); + let buf_reader = BufReader::new(&mut stream); + let http_request: Vec<_> = buf_reader + .lines() + .map(|result| result.unwrap()) + .take_while(|line| !line.is_empty()) + .collect(); + let status_line = "HTTP/1.1 200 OK"; let contents = fs::read_to_string("hello.html").unwrap(); + let length = contents.len(); - let response = format!( - "HTTP/1.1 200 OK\r\nContent-Length: {}\r\n\r\n{}", - contents.len(), - contents - ); + let response = + format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"); - stream.write(response.as_bytes()).unwrap(); - stream.flush().unwrap(); + stream.write_all(response.as_bytes()).unwrap(); } ``` From 14d2eb8a3b45328c176c428be33f233dce97ba3b Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 16 Jul 2023 11:20:48 +0200 Subject: [PATCH 54/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch20-02-multithreaded.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/ch20-02-multithreaded.md b/src/ch20-02-multithreaded.md index cd418ef7..89f73ff4 100644 --- a/src/ch20-02-multithreaded.md +++ b/src/ch20-02-multithreaded.md @@ -428,10 +428,10 @@ Lass uns den Code noch einmal überprüfen: $ cargo check Checking hello v0.1.0 (file:///projects/hello) error[E0599]: no method named `execute` found for struct `ThreadPool` in the current scope - --> src/bin/main.rs:16:14 + --> src/main.rs:17:14 | -16 | pool.execute(|| { - | ^^^^^^^ method not found in `hello::ThreadPool` +17 | pool.execute(|| { + | ^^^^^^^ method not found in `ThreadPool` For more information about this error, try `rustc --explain E0599`. error: could not compile `hello` due to previous error @@ -799,6 +799,15 @@ die wir ihr geben, und speichert eine `JoinHandle<()>`-Instanz, die durch das Erzeugen eines neuen Strangs unter Verwendung eines leeren Funktionsabschlusses erzeugt wird. +> Hinweis: Wenn das Betriebssystem keinen Strang erstellen kann, weil nicht +> genügend Systemressourcen vorhanden sind, bringt `thread::spawn` das Programm +> zum Abstürzen. Das führt dazu, dass unser gesamter Server abstürzt, auch wenn +> die Erstellung einiger Stränge erfolgreich wäre. Der Einfachheit halber +> lassen wir es bei diesem Verhalten, aber in einer produktiven +> Strang-Pool-Implementierung würdest du wahrscheinlich +> [`std::thread::Builder`][builder] mit der Methode [`spawn`][builder-spawn] +> verwenden wollen, die stattdessen `Result` zurückgibt. + Dieser Code kompiliert und speichert die Anzahl der `Worker`-Instanzen, die wir als Argument für `ThreadPool::new` angegeben haben. Aber wir *verarbeiten* noch nicht den Funktionsabschluss, den wir in `execute` erhalten. Schauen wir uns @@ -1446,9 +1455,9 @@ temporäre Werte erst am Ende des zugehörigen Blocks frei. In Codeblock 20-21 bleibt die Sperre für die Dauer des Aufrufs von `job()` erhalten, was bedeutet, dass andere `Worker` keine Aufträge erhalten können. -[type-synonyms]: -ch19-04-advanced-types.html#erstellen-von-typ-synonymen-mit-typ-alias +[builder]: https://doc.rust-lang.org/std/thread/struct.Builder.html +[builder-spawn]: https://doc.rust-lang.org/std/thread/struct.Builder.html#method.spawn +[fn-traits]: ch13-01-closures.html#verschieben-erfasster-werte-aus-funktionsabschlüssen-und-fn-merkmalen [integer-types]: ch03-02-data-types.html#ganzzahl-typen [similar-interface]: #erstellen-einer-endliche-anzahl-von-strängen -[fn-traits]: -ch13-01-closures.html#verschieben-erfasster-werte-aus-funktionsabschlüssen-und-fn-merkmalen +[type-synonyms]: ch19-04-advanced-types.html#erstellen-von-typ-synonymen-mit-typ-alias From df3572f21fb4c5fd6de900baf1c5da5b356f531b Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 16 Jul 2023 11:24:28 +0200 Subject: [PATCH 55/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ch20-03-graceful-shutdown-and-cleanup.md | 22 +++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/ch20-03-graceful-shutdown-and-cleanup.md b/src/ch20-03-graceful-shutdown-and-cleanup.md index 5a44ea04..a95dfa95 100644 --- a/src/ch20-03-graceful-shutdown-and-cleanup.md +++ b/src/ch20-03-graceful-shutdown-and-cleanup.md @@ -120,14 +120,15 @@ Hier ist der Fehler, den wir erhalten, wenn wir diesen Code kompilieren: $ cargo check Checking hello v0.1.0 (file:///projects/hello) error[E0507]: cannot move out of `worker.thread` which is behind a mutable reference - --> src/lib.rs:52:13 - | -52 | worker.thread.join().unwrap(); - | ^^^^^^^^^^^^^ ------ `worker.thread` moved due to this method call - | | - | move occurs because `worker.thread` has type `JoinHandle<()>`, which does not implement the `Copy` trait - | + --> src/lib.rs:52:13 + | +52 | worker.thread.join().unwrap(); + | ^^^^^^^^^^^^^ ------ `worker.thread` moved due to this method call + | | + | move occurs because `worker.thread` has type `JoinHandle<()>`, which does not implement the `Copy` trait + | note: this function takes ownership of the receiver `self`, which moves `worker.thread` + --> /rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/std/src/thread/mod.rs:1581:17 For more information about this error, try `rustc --explain E0507`. error: could not compile `hello` due to previous error @@ -238,6 +239,13 @@ error[E0599]: no method named `join` found for enum `Option` in the current scop | 52 | worker.thread.join().unwrap(); | ^^^^ method not found in `Option>` + | +note: the method `join` exists on the type `JoinHandle<()>` + --> /rustc/d5a82bbd26e1ad8b7401f6a718a9c57c96905483/library/std/src/thread/mod.rs:1581:5 +help: consider using `Option::expect` to unwrap the `JoinHandle<()>` value, panicking if the value is an `Option::None` + | +52 | worker.thread.expect("REASON").join().unwrap(); + | +++++++++++++++++ error[E0308]: mismatched types --> src/lib.rs:72:22 From 0ff4782ed29ec3338511087f9ae3d9664726261c Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 16 Jul 2023 12:09:06 +0200 Subject: [PATCH 56/57] =?UTF-8?q?Text=C3=A4nderungen=20aus=20dem=20Origina?= =?UTF-8?q?ltext=20=C3=BCbernehmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/appendix-07-nightly-rust.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/appendix-07-nightly-rust.md b/src/appendix-07-nightly-rust.md index a6510fac..580937dd 100644 --- a/src/appendix-07-nightly-rust.md +++ b/src/appendix-07-nightly-rust.md @@ -145,12 +145,14 @@ ermöglicht, neue Funktionen praktisch zu nutzen, bevor wir sie für immer für stabil erklären. Diejenigen, die sich für das Allerneueste entscheiden wollen, können dies tun, und diejenigen, die eine felsenfeste Erfahrung machen wollen, können bei der stabilen Version bleiben und wissen, dass ihr Code nicht brechen -wird. Stabilität ohne Stillstand. Dieses Buch enthält nur Informationen über -stabile Funktionalitäten, da sich in Entwicklung befindliche Funktionalitäten -noch ändern, und sicherlich werden sie sich zwischen dem Zeitpunkt, an dem -dieses Buch geschrieben wurde, und dem Zeitpunkt, an dem sie in stabilen -Versionen aktiviert werden, unterscheiden. Die Dokumentation für die nur -nächtlich verfügbaren Funktionalitäten findest du online. +wird. Stabilität ohne Stillstand. + +Dieses Buch enthält nur Informationen über stabile Funktionalitäten, da sich in +Entwicklung befindliche Funktionalitäten noch ändern, und sicherlich werden sie +sich zwischen dem Zeitpunkt, an dem dieses Buch geschrieben wurde, und dem +Zeitpunkt, an dem sie in stabilen Versionen aktiviert werden, unterscheiden. +Die Dokumentation für die nur nächtlich verfügbaren Funktionalitäten findest du +online. ### Rustup und die Rolle des nächtlichen Rust From 6c40a8903b42217bfea1f8983a083d12e4d169d2 Mon Sep 17 00:00:00 2001 From: Herbert Reiter <46045854+damoasda@users.noreply.github.com> Date: Sun, 16 Jul 2023 12:12:38 +0200 Subject: [PATCH 57/57] =?UTF-8?q?=C3=84nderungen=20im=20Originalbuch=20bis?= =?UTF-8?q?=20zum=2029.06.2023=20nachziehen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5748c0a1..f00b8f8b 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,6 @@ Vorschläge und Korrekturen oder gar Übersetzungen sind natürlich gerne gewün Falls du helfen möchtest, dann am besten via Pull Request oder Issue. Das Buch wurde mittlerweile komplett übersetzt und enthält alle Änderungen des -englischen Originals bis einschließlich zum **23.01.2023**. +englischen Originals bis einschließlich zum **29.06.2023**. Bitte beachte auch die [Übersetzungskonventionen](https://github.com/rust-lang-de/rustbook-de/wiki/%C3%9Cbersetzungskonventionen).