From b559cdd73f32c0d0cfc1feda39f82b3e3583df17 Mon Sep 17 00:00:00 2001 From: sjmann Date: Tue, 25 Feb 2020 09:48:50 +0000 Subject: [PATCH] added traits exercises --- exercises/traits/traits1.rs | 44 +++++++++++++++++++++++++++++++++++++ exercises/traits/traits2.rs | 35 +++++++++++++++++++++++++++++ info.toml | 22 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 exercises/traits/traits1.rs create mode 100644 exercises/traits/traits2.rs diff --git a/exercises/traits/traits1.rs b/exercises/traits/traits1.rs new file mode 100644 index 0000000..8253ef8 --- /dev/null +++ b/exercises/traits/traits1.rs @@ -0,0 +1,44 @@ +// traits1.rs +// Time to implement some traits! +// +// Your task is to implement the trait +// `AppendBar' for the type `String'. +// +// The trait AppendBar has only one function, +// which appends "Bar" to any object +// implementing this trait. + +// I AM NOT DONE +trait AppendBar { + fn append_bar(self) -> Self; +} + +impl AppendBar for String { + //Add your code here + +} + +fn main() { + let s = String::from("Foo"); + let s = s.append_bar(); + println!("s: {}", s); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn is_FooBar() { + assert_eq!(String::from("Foo").append_bar(), String::from("FooBar")); + } + + #[test] + fn is_BarBar() { + assert_eq!( + String::from("").append_bar().append_bar(), + String::from("BarBar") + ); + } + +} \ No newline at end of file diff --git a/exercises/traits/traits2.rs b/exercises/traits/traits2.rs new file mode 100644 index 0000000..84c35f7 --- /dev/null +++ b/exercises/traits/traits2.rs @@ -0,0 +1,35 @@ +// traits2.rs +// +// Your task is to implement the trait +// `AppendBar' for a vector of strings. +// +// To implement this trait, consider for +// a moment what it means to 'append "Bar"' +// to a vector of strings. +// +// No boiler plate code this time, +// you can do this! Hints at the bottom. + +// I AM NOT DONE + +trait AppendBar { + fn append_bar(self) -> Self; +} + +//TODO: Add your code here + + + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn is_vec_pop_eq_bar() { + let mut foo = vec![String::from("Foo")].append_bar(); + assert_eq!(foo.pop().unwrap(), String::from("Bar")); + assert_eq!(foo.pop().unwrap(), String::from("Foo")); + } + +} \ No newline at end of file diff --git a/info.toml b/info.toml index 2e6b0b4..178a6f4 100644 --- a/info.toml +++ b/info.toml @@ -586,6 +586,28 @@ multiply the values into a mutable variable. Or you might write code more functionally with recursion and a match clause. But you can also use ranges and iterators to solve this in rust.""" +# TRAITS + +[[exercises]] +name = "traits1" +path = "exercises/traits/traits1.rs" +mode = "test" +hint = """ +A discussion about Traits in Rust can be found at: +https://doc.rust-lang.org/1.30.0/book/second-edition/ch10-02-traits.html +""" + +[[exercises]] +name = "traits2" +path = "exercises/traits/traits2.rs" +mode = "test" +hint = """ +Notice how the trait takes ownership of 'self',and returns `Self'. +Try mutating the incoming string vector. + +Vectors provide suitable methods for adding an element at the end. See +the documentation at: https://doc.rust-lang.org/std/vec/struct.Vec.html""" + # THREADS [[exercises]]