mirror of
https://github.com/LukasKalbertodt/programmieren-in-rust.git
synced 2025-06-29 00:07:31 +02:00
Rename sheet folders to assure proper sorting
This commit is contained in:
36
aufgaben/sheet09/sol1/try-opt.rs
Executable file
36
aufgaben/sheet09/sol1/try-opt.rs
Executable file
@ -0,0 +1,36 @@
|
||||
// If we would make this public for everyone, we would need to use absolute
|
||||
// paths!
|
||||
macro_rules! try_opt {
|
||||
($e:expr) => {
|
||||
match $e {
|
||||
::std::option::Option::Some(v) => v,
|
||||
None => return None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! name {
|
||||
() => ($crate)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("{:?}", name!());
|
||||
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)
|
||||
}
|
42
aufgaben/sheet09/sol2/fmt.rs
Executable file
42
aufgaben/sheet09/sol2/fmt.rs
Executable file
@ -0,0 +1,42 @@
|
||||
struct LoveMachine<T> {
|
||||
inner: T,
|
||||
}
|
||||
|
||||
impl<T> LoveMachine<T> {
|
||||
pub fn new(t: T) -> Self {
|
||||
LoveMachine {
|
||||
inner: t,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! impl_fmt {
|
||||
($fmt_trait:ident, $fmt_str:expr) => {
|
||||
impl<T> ::std::fmt::$fmt_trait for LoveMachine<T>
|
||||
where T: ::std::fmt::$fmt_trait
|
||||
{
|
||||
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||
write!(f, concat!("♥", $fmt_str, "♥"), self.inner)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl_fmt!(Display, "{}");
|
||||
impl_fmt!(Debug, "{:?}");
|
||||
impl_fmt!(Octal, "{:o}");
|
||||
impl_fmt!(LowerHex, "{:x}");
|
||||
impl_fmt!(UpperHex, "{:X}");
|
||||
impl_fmt!(Binary, "{:b}");
|
||||
impl_fmt!(LowerExp, "{:e}");
|
||||
impl_fmt!(UpperExp, "{:E}");
|
||||
|
||||
fn main() {
|
||||
let lm = LoveMachine::new(27);
|
||||
println!("Display: {}", lm);
|
||||
println!("Debug: {:?}", lm);
|
||||
println!("Octal: {:o}", lm);
|
||||
println!("LowerHex: {:x}", lm);
|
||||
println!("UpperHex: {:X}", lm);
|
||||
println!("Binary: {:b}", lm);
|
||||
}
|
15
aufgaben/sheet09/sol3/map.rs
Executable file
15
aufgaben/sheet09/sol3/map.rs
Executable file
@ -0,0 +1,15 @@
|
||||
|
||||
macro_rules! hash_map {
|
||||
( $($key:expr => $value:expr ,)* ) => {{
|
||||
let mut map = ::std::collections::HashMap::new();
|
||||
$( map.insert($key, $value); )*
|
||||
map
|
||||
}};
|
||||
( $($key:expr => $value:expr),* ) => { hash_map!($($key => $value ,)*) };
|
||||
}
|
||||
|
||||
|
||||
fn main() {
|
||||
let ages = hash_map!{ "Sabine" => 26, "Peter" => 32 };
|
||||
println!("{:#?}", ages);
|
||||
}
|
7
aufgaben/sheet09/task1/README.md
Executable file
7
aufgaben/sheet09/task1/README.md
Executable 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.
|
20
aufgaben/sheet09/task1/try-opt.rs
Executable file
20
aufgaben/sheet09/task1/try-opt.rs
Executable 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/sheet09/task2/README.md
Executable file
18
aufgaben/sheet09/task2/README.md
Executable 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/sheet09/task3/README.md
Executable file
11
aufgaben/sheet09/task3/README.md
Executable 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);
|
||||
```
|
Reference in New Issue
Block a user