From a42665efbe758ff1835f4dcd170b8dadcc122ca6 Mon Sep 17 00:00:00 2001 From: Lukas Kalbertodt Date: Tue, 24 Jan 2017 15:09:26 +0100 Subject: [PATCH] Add additional material presented in the monday lecture --- materialien/animal.rs | 66 +++++++++++++++++++++++++++ materialien/tipps-abschlussprojekt.md | 29 ++++++++++++ 2 files changed, 95 insertions(+) create mode 100755 materialien/animal.rs create mode 100755 materialien/tipps-abschlussprojekt.md diff --git a/materialien/animal.rs b/materialien/animal.rs new file mode 100755 index 0000000..d2a6340 --- /dev/null +++ b/materialien/animal.rs @@ -0,0 +1,66 @@ +trait Animal { + fn speak(&self); +} + +struct Dog { + name: String, +} + +impl Animal for Dog { + fn speak(&self) { + println!("Wuff {}", self.name); + } +} + +struct Cat; + +impl Animal for Cat { + fn speak(&self) { + println!("meow"); + } +} + +/// There are basically three different ways you can write a +/// function. +/// +/// ``` +/// fn foo(x: T) // version A +/// fn foo(x: &Bar) // version B +/// fn foo(x: T) // version C +/// ``` +/// +/// - A: static dispatch only, monomorphization +/// - B: dynamic dispatch only, accepting a trait object +/// - C: static dispatch, but passing a trait object is allowed; +/// this is useful if you want to allow both +/// +fn speak_twice(a: &T) { + a.speak(); + a.speak(); +} + +/// We can't return `Animal` directly, because it is unsised. +/// So we need to hide it behind a pointer. But `&Animal` doesn't +/// work, because we would reference variables from the function. +/// To return an owned trait object, we use `Box`. +fn get_user_animal() -> Box { + println!("If you want a dog, give me a name:"); + let mut dog_name = String::new(); + std::io::stdin().read_line(&mut dog_name).expect("oh noe!"); + + let new_len = dog_name.trim_right().len(); + dog_name.truncate(new_len); + + + if dog_name.is_empty() { + Box::new(Cat) + } else { + Box::new(Dog { name: dog_name }) + } +} + +fn main() { + let a = get_user_animal(); + + speak_twice(&*a); +} diff --git a/materialien/tipps-abschlussprojekt.md b/materialien/tipps-abschlussprojekt.md new file mode 100755 index 0000000..66c99c6 --- /dev/null +++ b/materialien/tipps-abschlussprojekt.md @@ -0,0 +1,29 @@ +Tipps fürs Abschlussprojekt: +============================ + +### Crates finden + +Passende Crates finden ist mit `crates.io` noch ein bisschen schwierig. Daher: + +- [**`stdx`**](https://github.com/brson/stdx): Die wohl wichtigsten Rust-Crates. Hier sollte man zuerst schauen, wenn man etwas sucht. Außerdem ist es auch sinnvoll, sich die Crates einfach mal so anzuschauen, um zu sehen, was es schon alles gibt. +- [**Awesome Rust**](https://github.com/kud1ing/awesome-rust): Lange Liste mit Crates zu jedem Thema. + + +### Travis + +Continuous Integration Services sind super hilfreich, gerade bei stark typisierten Sprachen und TDD Projekten. Travis ist ein solcher Service, den ihr kostenlos nutzen und extrem schnell einrichten könnt. Mehr Informationen gibt es z.B. [hier](https://docs.travis-ci.com/user/languages/rust/). Aber in kurz: + +1. Eine `.travis.yml` in eurem Repository mit folgendem Inhalt anlegen: + +``` +language: rust +rust: + - stable + - beta + - nightly +matrix: + allow_failures: + - rust: nightly +``` + +2. Auf `travis-ci.com` mit GitHub Account anmelden und Repository aktivieren.