From 61db78f64b52039c8fc3ad075e4f97145165027b Mon Sep 17 00:00:00 2001 From: Lukas Kalbertodt Date: Wed, 4 Jan 2017 12:40:47 +0100 Subject: [PATCH] Add sheet 9 --- aufgaben/sheet9/task1/README.md | 7 +++++++ aufgaben/sheet9/task1/try-opt.rs | 20 ++++++++++++++++++++ aufgaben/sheet9/task2/README.md | 18 ++++++++++++++++++ aufgaben/sheet9/task3/README.md | 11 +++++++++++ 4 files changed, 56 insertions(+) create mode 100755 aufgaben/sheet9/task1/README.md create mode 100755 aufgaben/sheet9/task1/try-opt.rs create mode 100755 aufgaben/sheet9/task2/README.md create mode 100755 aufgaben/sheet9/task3/README.md diff --git a/aufgaben/sheet9/task1/README.md b/aufgaben/sheet9/task1/README.md new file mode 100755 index 0000000..b2378d6 --- /dev/null +++ b/aufgaben/sheet9/task1/README.md @@ -0,0 +1,7 @@ +Aufgabe 1: `try!` für `Option` +============================== + +Wir hätten gerne ein Makro `try_opt!()`, welches wie `try!()` funktioniert, allerdings für `Option`s. +`try_opt!(Some(3))` soll zu "3" evaluieren, während `try_opt!(None)` ein early return auslösen soll. + +Die beiden vorgegebenen Funktionen sollen wie erwartet funktionieren. diff --git a/aufgaben/sheet9/task1/try-opt.rs b/aufgaben/sheet9/task1/try-opt.rs new file mode 100755 index 0000000..64675f9 --- /dev/null +++ b/aufgaben/sheet9/task1/try-opt.rs @@ -0,0 +1,20 @@ +fn main() { + println!("consistent: {:?}", is_home_consistent()); + println!("dummy: {:?}", foo()); +} + +fn foo() -> Option { + let a: u8 = try_opt!(Some(50)); + let b = try_opt!(a.checked_mul(6)); + + Some(b / 2) +} + +fn is_home_consistent() -> Option { + use std::env; + + let home_dir = try_opt!(env::home_dir()); + let home_var = try_opt!(env::var_os("HOME")); + + Some(home_dir == home_var) +} diff --git a/aufgaben/sheet9/task2/README.md b/aufgaben/sheet9/task2/README.md new file mode 100755 index 0000000..166088a --- /dev/null +++ b/aufgaben/sheet9/task2/README.md @@ -0,0 +1,18 @@ +Aufgabe 2: Schnelles Implementieren von `fmt` Traits +==================================================== + +In [Aufgabe 6.3][a63] solltet ihr den fragwürdigen Typ `Swagger` implementieren. +Die konkrete Aufgabe war recht sinnlos, aber das Wrapper-Pattern allgemein ist sehr nützlich, wie wir kurz in der Vorlesung besprochen haben. + +Beim letzten mal sollte jedoch nur `Display` für `Swagger` implementiert werden. +Allerdings gibt es ja deutlich mehr Traits zur Ausgabe von Werten, z.B. auch `Debug`. +In dieser Aufgabe sollt ihr [alle Formatting-Traits des `fmt` Moduls][std-fmt] (außer `Pointer`) für `Swagger` implementieren, wenn der innere Typ diese Traits implementiert. +Doch natürlich fällt euch auf, dass ein manuelles Vorgehen in ziemlich viel doppeltem oder ähnlichem Code enden würde. +Daher sollt ihr ein Makro schreiben, um ähnlichen/doppelten Code möglichst zu vermeiden! + +Schreibt außerdem ein bisschen Beispielcode in `main()`, um die Implementationen zu auszuprobieren. + + + +[a63]: https://github.com/LukasKalbertodt/programmieren-in-rust/tree/master/aufgaben/sheet6/task3 +[std-fmt]: https://doc.rust-lang.org/std/fmt/index.html#formatting-traits diff --git a/aufgaben/sheet9/task3/README.md b/aufgaben/sheet9/task3/README.md new file mode 100755 index 0000000..22f74ff --- /dev/null +++ b/aufgaben/sheet9/task3/README.md @@ -0,0 +1,11 @@ +Aufgabe 3: Einfach Hashmap erstellen +==================================== + +Wir kennen ja das `vec![]` Makro, welches sich wunderbar eignet, um direkt einen Vektor mit bestimmten Werten zu erstellen. +Da es ein solches Makro nicht in der Standardbibliothek gibt, sollt ihr in dieser Aufgabe ein solches Makro schreiben. +Die genaue Syntax ist nicht so wichtig, aber ich könnt z.B. eine Ruby-ähnliche Syntax nutzen: + +```rust +let ages = hash_map!{ "Sabine" => 26, "Peter" => 32 }; +println!("{:#?}", ages); +```