feat: Add traits1.rs and traits2.rs exercises

Rustlings is currently lacking any exercise that teaches
the basic use syntax and implementation of traits. Adding these
two exercises addresses this issue.
This commit is contained in:
marios 2019-09-04 14:22:25 +09:00
parent 17690b3add
commit 5cf5cd6fd1
3 changed files with 148 additions and 0 deletions

View file

@ -0,0 +1,97 @@
// 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.
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")
);
}
}
// A discussion about Traits in Rust can be found below.
// https://doc.rust-lang.org/1.30.0/book/second-edition/ch10-02-traits.html

View file

@ -0,0 +1,41 @@
// 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.
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"));
}
}
// 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

View file

@ -221,3 +221,13 @@ mode = "test"
[[exercises]]
path = "exercises/standard_library_types/iterators4.rs"
mode = "test"
# TRAITS
[[exercises]]
path = "exercises/traits/traits1.rs"
mode = "test"
[[exercises]]
path = "exercises/traits/traits2.rs"
mode = "test"