Add sheet 9

This commit is contained in:
Lukas Kalbertodt 2017-01-04 12:40:47 +01:00
parent 9b825336c2
commit 61db78f64b
4 changed files with 56 additions and 0 deletions

View File

@ -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.

View File

@ -0,0 +1,20 @@
fn main() {
println!("consistent: {:?}", is_home_consistent());
println!("dummy: {:?}", foo());
}
fn foo() -> Option<u8> {
let a: u8 = try_opt!(Some(50));
let b = try_opt!(a.checked_mul(6));
Some(b / 2)
}
fn is_home_consistent() -> Option<bool> {
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)
}

18
aufgaben/sheet9/task2/README.md Executable file
View File

@ -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<T: Display>` 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

11
aufgaben/sheet9/task3/README.md Executable file
View File

@ -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);
```