summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-06-27 11:58:44 +0200
committermo8it <mo8it@proton.me>2024-06-27 11:58:44 +0200
commit091e1e7f7a1afad539479674e06cae7c8d8dab7f (patch)
treef458802a4457f5d27252bde62792018a25eda255
parent92f249a52ca993d65db6ed70b85535c2f1720ec3 (diff)
traits2 solution
-rw-r--r--exercises/15_traits/traits2.rs13
-rw-r--r--rustlings-macros/info.toml15
-rw-r--r--solutions/15_traits/traits2.rs28
3 files changed, 37 insertions, 19 deletions
diff --git a/exercises/15_traits/traits2.rs b/exercises/15_traits/traits2.rs
index 170779b..e904016 100644
--- a/exercises/15_traits/traits2.rs
+++ b/exercises/15_traits/traits2.rs
@@ -1,14 +1,9 @@
-// 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!
-
trait AppendBar {
fn append_bar(self) -> Self;
}
-// TODO: Implement trait `AppendBar` for a vector of strings.
+// TODO: Implement the trait `AppendBar` for a vector of strings.
+// `appned_bar` should push the string "Bar" into the vector.
fn main() {
// You can optionally experiment here.
@@ -21,7 +16,7 @@ mod tests {
#[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"));
+ assert_eq!(foo.pop().unwrap(), "Bar");
+ assert_eq!(foo.pop().unwrap(), "Foo");
}
}
diff --git a/rustlings-macros/info.toml b/rustlings-macros/info.toml
index 2cc1db6..604f674 100644
--- a/rustlings-macros/info.toml
+++ b/rustlings-macros/info.toml
@@ -755,21 +755,18 @@ https://doc.rust-lang.org/stable/book/ch10-01-syntax.html#in-method-definitions"
name = "traits1"
dir = "15_traits"
hint = """
-A discussion about Traits in Rust can be found at:
-https://doc.rust-lang.org/book/ch10-02-traits.html
-"""
+More about traits in The Book:
+https://doc.rust-lang.org/book/ch10-02-traits.html"""
[[exercises]]
name = "traits2"
dir = "15_traits"
hint = """
-Notice how the trait takes ownership of `self`, and returns `Self`.
-
-Try mutating the incoming string vector. Have a look at the tests to see
-what the result should look like!
+Notice how the trait takes ownership of `self` and returns `Self`.
-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"""
+Although the signature of `append_bar` in the trait takes `self` as argument,
+the implementation can take `mut self` instead. This is possible because the
+the value is owned anyway."""
[[exercises]]
name = "traits3"
diff --git a/solutions/15_traits/traits2.rs b/solutions/15_traits/traits2.rs
index 4e18198..0db93e0 100644
--- a/solutions/15_traits/traits2.rs
+++ b/solutions/15_traits/traits2.rs
@@ -1 +1,27 @@
-// Solutions will be available before the stable release. Thank you for testing the beta version 🥰
+trait AppendBar {
+ fn append_bar(self) -> Self;
+}
+
+impl AppendBar for Vec<String> {
+ fn append_bar(mut self) -> Self {
+ // ^^^ this is important
+ self.push(String::from("Bar"));
+ self
+ }
+}
+
+fn main() {
+ // You can optionally experiment 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(), "Bar");
+ assert_eq!(foo.pop().unwrap(), "Foo");
+ }
+}